Beispiel #1
0
  private String getSubstitutesRespString() throws ISPACException {
    if (StringUtils.isEmpty(resp)) {

      TreeSet respList = new TreeSet();
      DbCnt cnt = context.getConnection();

      try {
        Responsible user = context.getUser();
        respList.addAll(user.getRespList());

        if (mWorkMode == IWorklistAPI.SUPERVISOR) {

          SecurityMgr security = new SecurityMgr(cnt);

          // Sustituir (sustituidos por el usuario y por los grupos a los que pertenece el usuario)
          IItemCollection collection = security.getAllSubstitutes(user);
          addRespListFromEntryUID(respList, collection, "UID_SUSTITUIDO");
        }
      } finally {
        context.releaseConnection(cnt);
      }

      resp = "'" + StringUtils.join(respList, "','") + "'";
    }
    if (logger.isDebugEnabled()) {
      logger.debug("getSubstitutesRespString:" + resp);
    }
    return resp;
  }
Beispiel #2
0
 private void setSecurityData(CopySoapStub _stub) {
   // Añadimos los datos de seguridad y timeout.
   if (StringUtils.isNotEmpty(user)) {
     _stub.setUsername(user);
   }
   if (StringUtils.isNotEmpty(password)) {
     _stub.setPassword(password);
   }
 }
Beispiel #3
0
  /**
   * Obtener el contenido del documento que tenga asignado el CSV recibido.
   *
   * @param context Contexto de tramitación.
   * @param csv CSV del documento
   * @return Contenido del documento.
   * @throws ISPACException Si se produce algún error.
   */
  public static byte[] getContenidoDocumento(IClientContext context, String csv)
      throws ISPACException {

    // Contenido del documento
    byte[] content = null;

    // Consulta
    String sqlQuery = "WHERE COD_COTEJO = '" + DBUtil.replaceQuotes(csv) + "'";
    IItemCollection documents =
        context.getAPI().getEntitiesAPI().queryEntities(SpacEntities.SPAC_DT_DOCUMENTOS, sqlQuery);
    if (documents.next()) {

      IItem document = documents.value();

      // Obtener el identificador del documento en el repositorio
      String guid = document.getString("INFOPAG_RDE");
      if (StringUtils.isBlank(guid)) {
        guid = document.getString("INFOPAG");
      }

      // Obtener el contenido del documento
      content =
          ieci.tdw.ispac.services.helpers.DocumentsHelper.getContenidoDocumento(context, guid);
    }

    return content;
  }
Beispiel #4
0
 /**
  * Obtiene la lista de expedientes enviados a la papelera
  *
  * @fechaInicio Fecha de creación del expediente
  * @fechaEliminacion Fecha de eliminación del expediente
  * @procedimiento Procedimiento al que pertenece el expediente
  * @return
  * @throws ISPACException
  */
 public IItemCollection getExpedientsSentToTrash(
     String fechaInicio, String fechaEliminacion, int procedimiento) throws ISPACException {
   DbCnt cnt = mcontext.getConnection();
   try {
     String sMaxResultados =
         ISPACConfiguration.getInstance().get(ISPACConfiguration.MAX_EXPS_SHOW_TRASH);
     int max = 0;
     if (StringUtils.isNotBlank(sMaxResultados)) {
       max = TypeConverter.parseInt(sMaxResultados.trim(), 0);
     }
     return TXProcesoDAO.getExpedients(
         cnt,
         "PROCESOS.TIPO="
             + IProcess.PROCESS_TYPE
             + " AND PROCESOS.ESTADO="
             + TXConstants.STATUS_DELETED,
         max,
         fechaInicio,
         fechaEliminacion,
         procedimiento);
   } catch (ISPACException ie) {
     throw new ISPACException("Error en invesflowAPI:getExpedientsSentToTrash()", ie);
   } finally {
     mcontext.releaseConnection(cnt);
   }
 }
  /**
   * Obtiene el conector de proceso de firma. Portafirmas
   *
   * @return Conector de de proceso de firma. Portafirmas
   * @throws ISPACException si ocurre algún error.
   */
  public ProcessSignConnector getProcessSignConnector() throws ISPACException {

    ProcessSignConnector processSignConnector = null;

    // Comprobar que se haya establecido el nombre de la clase
    if (StringUtils.isBlank(className)) {
      return new ProcessSignConnectorImpl();
    }

    try {

      // Cargar la clase
      Class clazz = Class.forName(className);
      if (!ProcessSignConnector.class.isAssignableFrom(clazz)) {
        throw new ISPACException(className + " no implementa el interfaz ProcessSignConnector");
      }

      // Instanciar la clase
      processSignConnector = (ProcessSignConnector) clazz.newInstance();

      if (logger.isDebugEnabled()) {
        logger.debug("ProcessSignConnector creado [" + className + "]");
      }
    } catch (Exception e) {
      logger.error("Error al instanciar el conector del proceso de firma. Portafirmas", e);
      throw new ISPACException(e);
    }

    return processSignConnector;
  }
Beispiel #6
0
  public IItemCollection getPermissions(int typeObject, int idObject, int[] typePermissions)
      throws ISPACException {
    CollectionDAO coldao =
        PermissionDAO.getPermissions(mDbCnt, typeObject, idObject, typePermissions);

    List list = new ArrayList();
    while (coldao.next()) {

      ObjectDAO permission = coldao.value();
      String respName = permission.getString("RESP_NAME");
      if (StringUtils.isBlank(respName)) {

        String idResp = permission.getString("ID_RESP");
        IResponsible responsible = null;

        try {
          responsible = getResp(idResp);
          // } catch (ISPACException ie) {
        } catch (Exception ie) {
          // java.lang.NumberFormatException
          // si el ID_RESP no es un UID y es el nombre del responsable
        }

        /*
        if (responsible != null) {

        	// Establecer el nombre del responsable
        	permission.set("RESP_NAME", responsible.getRespName());
        	permission.store(mDbCnt);
        } else {
        	// Eliminar el permiso asociado al responsable que ya no existe
        	// permission.delete(mDbCnt);
        	// No eliminar sino no incluirlo en la lista
        	permission = null;
        }
        */

        if (responsible != null) {
          // Establecer el nombre del responsable
          permission.set("RESP_NAME", responsible.getRespName());
          permission.store(mDbCnt);
        }
        /*else {
        	// Establecer el ID como nombre del responsable
        	permission.set("RESP_NAME", idResp);
        }
        permission.store(mDbCnt);
        */
      }

      if (permission != null) {
        list.add(permission);
      }
    }

    return new ListCollection(list);
  }
Beispiel #7
0
  public static String addAndInResponsibleOrExistPermissionCondition(String resp)
      throws ISPACException {
    String sql = addInResponsibleOrExistPermissionCondition(resp);

    if (StringUtils.isNotBlank(sql)) {
      sql = " AND " + sql;
    }

    return sql;
  }
Beispiel #8
0
  public static int countProcess(DbCnt cnt, String numexp, String query) throws ISPACException {
    String sql = "WHERE ";
    if (StringUtils.isNotBlank(numexp)) {
      sql += " NUMEXP = '" + DBUtil.replaceQuotes(numexp) + "'";
    }
    if (sql != null && sql.length() > 0) sql += query;

    CollectionDAO objlist = new CollectionDAO(TXProcesoDAO.class);
    return objlist.count(cnt, sql);
  }
Beispiel #9
0
  /* (non-Javadoc)
   * @see ieci.tdw.ispac.api.IWorklistAPI#getRespString()
   */
  public String getRespString() throws ISPACException {

    if (StringUtils.isEmpty(resp)) {

      TreeSet respList = new TreeSet();
      DbCnt cnt = context.getConnection();

      try {
        Responsible user = context.getUser();
        List respListUser = user.getRespList();
        respList.addAll(respListUser);
        if (mWorkMode == IWorklistAPI.SUPERVISOR) {
          SecurityMgr securityMgr = new SecurityMgr(cnt);

          // Comprobar si el usuario tiene asignada la función de Supervisor
          if (securityMgr.isSupervisor(user.getUID())) {
            return Responsible.SUPERVISOR;
          }

          // Supervisar (supervisados del usuario, del departamento y de los grupos a los que
          // pertenece el usuario)
          IItemCollection collection = securityMgr.getAllSuperviseds(user);
          addRespListFromEntryUID(respList, collection, "UID_SUPERVISADO");
          // Sustituir (sustituidos por el usuario, por el departamento y por los grupos a los que
          // pertenece el usuario)
          collection = securityMgr.getAllSubstitutes(user);
          addRespListFromEntryUID(respList, collection, "UID_SUSTITUIDO");
        }
      } finally {
        context.releaseConnection(cnt);
      }

      resp = "'" + StringUtils.join(respList, "','") + "'";
    }
    if (logger.isDebugEnabled()) {
      logger.debug("getRespString:" + resp);
    }
    return resp;
  }
Beispiel #10
0
  public static IItemCollection getExpedients(
      DbCnt cnt,
      String query,
      int limit,
      String fechaInicio,
      String fechaEliminacion,
      int idProcedimiento)
      throws ISPACException {

    TableJoinFactoryDAO factory = new TableJoinFactoryDAO();

    factory.addTable(TABLENAME, "PROCESOS");
    factory.addTable("SPAC_P_PROCEDIMIENTOS", "PPROCEDIMIENTOS");

    String sql = " WHERE PPROCEDIMIENTOS.ID = PROCESOS.ID_PCD" + " AND " + query;

    // Fecha de inicio
    if (StringUtils.isNotBlank(fechaInicio)) {

      sql += " AND PROCESOS.FECHA_INICIO >= " + DBUtil.getToTimestampByBD(cnt, fechaInicio);
    }

    // Fecha de eliminacion
    if (StringUtils.isNotBlank(fechaEliminacion)) {
      sql +=
          " AND  PROCESOS.FECHA_ELIMINACION <=  "
              + DBUtil.getToTimestampByBD(cnt, fechaEliminacion);
    }

    if (idProcedimiento != -1) {
      sql += " AND PROCESOS.ID_PCD=" + idProcedimiento;
    }

    sql += " ORDER BY PPROCEDIMIENTOS.NOMBRE";

    return factory.queryTableJoin(cnt, sql, limit).disconnect();
  }
Beispiel #11
0
  public static String addInResponsibleOrExistPermissionCondition(
      String inResponsibleCondition, String inPermResponsibleCondition) throws ISPACException {
    StringBuffer sql = new StringBuffer();

    if (StringUtils.isNotBlank(inResponsibleCondition)) {

      // Añadir la responsabilidad
      // y consultar los permisos asignados
      sql.append(
          getSqlInResponsibleOrExistPermissionCondition(
              inResponsibleCondition, inPermResponsibleCondition));
    }

    return sql.toString();
  }
  /**
   * Obtiene la URL de un fichero. La búsqueda de realiza en el orden siguiente:
   *
   * <ul>
   *   <li>Classpath de la aplicación
   *   <li>Classpath del sistema
   *   <li>Ruta absoluta
   * </ul>
   *
   * @param resource Nombre del fichero.
   * @return URL del fichero.
   */
  public static URL getFileURL(String resource) {

    URL url = null;

    if (resource != null) {

      // Comprobar el fichero en el classpath de la aplicación
      url = ISPACConfigLocation.class.getClassLoader().getResource(resource);
      if (url == null) {

        // Comprobar el fichero en el classpath del sistema
        url = ClassLoader.getSystemResource(resource);
        if (url == null) {

          try {

            // Fichero con path relativo a la aplicación
            String appPath = ISPACConfigLocation.getInstance().get(APP_PATH);
            if (StringUtils.isNotBlank(appPath)) {
              File file = new File(appPath + resource);
              if (file.isFile()) {
                url = file.toURL();
              }
            }
          } catch (Exception e) {
            url = null;
          }

          if (url == null) {
            try {

              // Fichero con path absoluto
              File file = new File(resource);
              if (file.isFile()) {
                url = file.toURL();
              }

            } catch (Exception e) {
              url = null;
            }
          }
        }
      }
    }

    return url;
  }
  public ActionForward executeAction(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response,
      SessionAPI session)
      throws Exception {

    // Comprobar si el usuario tiene asignadas las funciones adecuadas
    FunctionHelper.checkFunctions(
        request, session.getClientContext(), new int[] {ISecurityAPI.FUNC_PUB_RULES_EDIT});

    IInvesflowAPI invesFlowAPI = session.getAPI();
    IPublisherAPI publisherAPI = invesFlowAPI.getPublisherAPI();

    // Formulario asociado a la regla
    EntityForm defaultForm = (EntityForm) form;

    int keyId = Integer.parseInt(defaultForm.getKey());

    // Información de la regla
    IItem rule = publisherAPI.getRule(keyId);

    // Eliminar la regla
    publisherAPI.deleteRule(keyId);

    String pcdId = request.getParameter("pcdId");
    if (!StringUtils.isEmpty(pcdId)) {

      return new ActionForward(
          new StringBuffer()
              .append("/showPubRulesList.do?pcdId=")
              .append(pcdId)
              .append("&stageId=")
              .append(rule.getString("ID_FASE"))
              .append("&taskId=")
              .append(rule.getString("ID_TRAMITE"))
              .append("&typeDoc=")
              .append(rule.getString("TIPO_DOC"))
              .toString(),
          true);
    } else {
      return new ActionForward("/showPubRulesGroupList.do", true);
    }
  }
Beispiel #14
0
  protected void validate(
      ClientContext cs, TXTransactionDataContainer dtc, TXProcesoDAO process, TXFaseDAO stage)
      throws ISPACException {

    IBPMAPI bpmAPI = dtc.getBPMAPI();
    TXProcedure procedure = TXProcedureMgr.getInstance().getProcedure(cs, process.getIdProcedure());
    // PFaseDAO pStage = procedure.getStageDAO(stage.getInt("ID_FASE"));
    PNodoDAO pNode = procedure.getNode(cs.getConnection(), stage.getInt("ID_FASE"));

    String previousStageUID =
        bpmAPI.getPreviousStage(
            process.getString("ID_PROCESO_BPM"), pNode.getString("ID_NODO_BPM"));
    if (StringUtils.isEmpty(previousStageUID)) {
      if (stage.getInt("TIPO") == IStage.STAGE_TYPE)
        throw new ISPACInfo("exception.expedients.previousStage.noStage");
      else throw new ISPACInfo("exception.subprocess.previousActivitiy.noActivity");
    }
  }
Beispiel #15
0
  public static String addInResponsibleOrExistPermissionCondition(String resp)
      throws ISPACException {
    String sql = " ";

    // Obtener la condición SQL de responsabilidad y de permisos
    // siempre que la responsabilidad no sea de Supervisor
    if (StringUtils.isNotBlank(resp) && !Responsible.SUPERVISOR.equalsIgnoreCase(resp)) {

      String sqlResponsibles = DBUtil.addInResponsibleCondition("ID_RESP", resp);

      // Añadir la responsabilidad y consultar los permisos asignados
      sql =
          getSqlInResponsibleOrExistPermissionCondition(
              sqlResponsibles, DBUtil.addInResponsibleCondition("SPC_PERMS.ID_RESP", resp));
    }

    return sql;
  }
  public void setItem(IItem item) throws ISPACException {

    IEntitiesAPI entitiesAPI = mContext.getAPI().getEntitiesAPI();

    if (!(item instanceof EntityDAO)) {
      throw new ISPACException("El objeto item no es una instancia de EntityDAO.");
    }
    EntityDAO mainEntityDAO = (EntityDAO) item;

    // Tabla y clave de la entidad principal
    mPrefixMainEntity = mainEntityDAO.getTableName();
    mKeyMainEntity = mainEntityDAO.getKeyName();

    // TODO Incorporar al EntityDAO campo NUMEXP y DEFINICION de la entidad para no tener que
    // consultar la definición que ya se consulta para crear el EntityDAO
    // Obtener la definición de la entidad principal
    mainEntityDef = (IEntityDef) entitiesAPI.getCatalogEntity(mMainEntityId);

    // Crear un CompositeItem al que se le añadiran las entidades secundarias de
    // de sustituto, composición y relación múltiple cuando existan en los parámetros del formulario
    CompositeItem composite = new CompositeItem(mPrefixMainEntity + ":" + mKeyMainEntity);
    composite.addItem(item, mPrefixMainEntity + ":");
    this.mitem = composite;

    // El número de expediente se establece inicialmente por parámetro en el EntityAppFactory
    // sino se busca en el item de la entidad principal a partir de su definición
    if (StringUtils.isEmpty(msExpedient)) {
      msExpedient = item.getString(mainEntityDef.getKeyNumExp());
    }

    /*
    // El identificador del procedimiento se establece inicialmente por parámetro en el EntityAppFactory
    // sino se busca en el item del expediente
    if (mPcdId == ISPACEntities.ENTITY_NULLREGKEYID) {
    	mPcdId = entitiesAPI.getExpedient(msExpedient).getInt("ID_PCD");
    }
    */

    // Obtener los campos obligatorios para la entidad principal
    EntityDef entityDefinicion = getRequiredData(mainEntityDef);

    // Obtener la definición de los campos para la entidad principal
    setFieldDefs(mainEntityDef.getName(), entityDefinicion);
  }
  public List validate(String name, SessionAPI session) throws ISPACException {

    ArrayList mErrorList = new ArrayList();

    ValidationError error = null;

    if (StringUtils.isBlank(name)) {

      error =
          new ValidationError(
              "property(NEW_CALENDAR_NAME)",
              "errors.required",
              new String[] {
                Messages.getString(
                    session.getClientContext().getAppLanguage(), "form.calendar.propertyLabel.name")
              });
      mErrorList.add(error);
    } else {
      IInvesflowAPI invesFlowAPI = session.getAPI();
      ICatalogAPI catalogAPI = invesFlowAPI.getCatalogAPI();

      // Bloqueo
      IItemCollection itemcol = catalogAPI.queryCTEntities(ICatalogAPI.ENTITY_SPAC_CALENDARIOS, "");
      // Nombre único de calendario

      itemcol =
          (IItemCollection)
              catalogAPI.queryCTEntities(
                  ICatalogAPI.ENTITY_SPAC_CALENDARIOS,
                  " WHERE NOMBRE = '" + DBUtil.replaceQuotes(name) + "'");
      if (itemcol.next()) {

        error =
            new ValidationError(
                "property(NEW_CALENDAR_NAME)",
                "error.calendar.nameDuplicated",
                new String[] {name});
        mErrorList.add(error);
      }
    }
    return mErrorList;
  }
  /**
   * Establece los campos requeridos para una entidad a partir de las validaciones de obligatoriedad
   * de su definición.
   *
   * @param entityDef Definición de la entidad.
   * @return La definición parseada de la entidad.
   * @throws ISPACException Si se produce algún error.
   */
  public EntityDef getRequiredData(IEntityDef entityDef) throws ISPACException {

    // Obtener la definición de la entidad
    String xmlDefinicion = entityDef.getDefinition();
    if (!StringUtils.isEmpty(xmlDefinicion)) {

      // Parsear la definición de la entidad
      EntityDef entityDefinicion = EntityDef.parseEntityDef(xmlDefinicion);
      if (entityDefinicion != null) {

        // Obtener las validaciones
        List validations = entityDefinicion.getValidations();
        if ((validations != null) && (!validations.isEmpty())) {

          Map fields = entityDefinicion.fieldsToMap();
          Iterator it = validations.iterator();
          while (it.hasNext()) {

            // Validación de campo obligatorio
            EntityValidation entityValidation = (EntityValidation) it.next();
            if (entityValidation.isMandatory()) {

              // Establecer el campo como requerido
              EntityField field =
                  (EntityField) fields.get(new Integer(entityValidation.getFieldId()));
              if (field != null) {

                setRequired(entityDef.getName() + ":" + field.getPhysicalName().toUpperCase());
              }
            }
          }
        }
      }

      return entityDefinicion;
    }

    return null;
  }
  public ActionForward executeAction(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response,
      SessionAPI session)
      throws Exception {

    ClientContext cct = session.getClientContext();

    // Comprobar si el usuario tiene asignadas las funciones adecuadas
    FunctionHelper.checkFunctions(
        request, session.getClientContext(), new int[] {ISecurityAPI.FUNC_COMP_ENTITIES_EDIT});

    IInvesflowAPI invesFlowAPI = session.getAPI();
    ICatalogAPI catalogAPI = invesFlowAPI.getCatalogAPI();

    Upload2Form upload2Form = (Upload2Form) form;
    String upload = request.getParameter("upload");

    try {

      if (upload.equals("design")) {

        FormFile formfile = upload2Form.getUploadFile();
        String htmlCode = new String(formfile.getFileData());

        if (!StringUtils.isEmpty(htmlCode)) {

          // Obtener el formulario JSP de la aplicación
          IItem application =
              catalogAPI.getCTEntity(
                  ICatalogAPI.ENTITY_CT_APP, Integer.parseInt(upload2Form.getKey()));
          if (application != null) {

            List entities = new ArrayList();

            // Entidad principal
            entities.add(application.getString("ENT_PRINCIPAL_NOMBRE"));

            // Entidades de composición y de relación múltiple
            String parameters = application.getString("PARAMETROS");
            if (!StringUtils.isEmpty(parameters)) {

              ParametersDef xmlParameters = ParametersDef.parseParametersDef(parameters);
              List compositeEntities = xmlParameters.getCompositeMultipleRelationEntities();
              Iterator it = compositeEntities.iterator();
              while (it.hasNext()) {

                EntityParameterDef entityParameterDef = (EntityParameterDef) it.next();
                entities.add(entityParameterDef.getTable());
              }
            }

            String frm_jsp = application.getString("FRM_JSP");
            String jspCode = HTMLBuilder.updateHTML(htmlCode, frm_jsp, entities);
            if (jspCode != null) {

              application.set("FRM_JSP", jspCode);

              // Incrementar la versión del formulario
              int version = 1;
              String sVersion = application.getString("FRM_VERSION");
              if (!StringUtils.isEmpty(sVersion)) {
                version += Integer.parseInt(sVersion);
              }
              application.set("FRM_VERSION", version);

              application.store(cct);
            }
          }
        } else {
          throw new ISPACInfo("exception.uploadfile.empty");
        }
      } else if (upload.equals("code")) {

        FormFile formfile2 = upload2Form.getUploadFile2();
        String jspCode = new String(formfile2.getFileData());

        if (!StringUtils.isEmpty(jspCode)) {

          // Obtener la aplicación
          IItemCollection itemcol =
              catalogAPI.queryCTEntities(
                  ICatalogAPI.ENTITY_CT_APP, "where ID =" + upload2Form.getKey());
          if (itemcol.next()) {

            IItem application = itemcol.value();
            application.set("FRM_JSP", jspCode);

            // Incrementar la versión del formulario
            int version = 1;
            String sVersion = application.getString("FRM_VERSION");
            if (!StringUtils.isEmpty(sVersion)) {
              version += Integer.parseInt(sVersion);
            }
            application.set("FRM_VERSION", version);

            application.store(cct);
          }
        } else {
          throw new ISPACInfo("exception.uploadfile.empty");
        }
      }
    } catch (IOException e) {
      throw new ISPACInfo("exception.uploadfile.error");
    }

    return mapping.findForward("success");

    /*
    request.setAttribute("refresh", "true");
    return mapping.findForward("success_upload");
    */
  }
 public boolean isDefaultConnector() {
   return StringUtils.equalsIgnoreCase(className, defaultImplClass);
 }
  public ActionForward executeAction(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response,
      SessionAPI session)
      throws Exception {

    // Comprobar si el usuario tiene asignadas las funciones adecuadas
    FunctionHelper.checkFunctions(
        request,
        session.getClientContext(),
        new int[] {ISecurityAPI.FUNC_INV_DOCTYPES_EDIT, ISecurityAPI.FUNC_INV_TEMPLATES_EDIT});

    IInvesflowAPI invesFlowAPI = session.getAPI();
    ICatalogAPI catalogAPI = invesFlowAPI.getCatalogAPI();
    ITemplateAPI templateAPI = invesFlowAPI.getTemplateAPI();

    // Formulario asociado a la acción
    UploadForm defaultForm = (UploadForm) form;

    int keyId = Integer.parseInt(defaultForm.getKey());
    int entityId = Integer.parseInt(defaultForm.getEntity());
    String name = defaultForm.getProperty("NOMBRE");
    String code = defaultForm.getProperty("COD_PLANT");
    CTTemplate template = null;

    try {

      if (keyId == ISPACEntities.ENTITY_NULLREGKEYID) {

        int type = Integer.parseInt(defaultForm.getProperty("ID_TPDOC"));
        String expresion = defaultForm.getProperty("EXPRESION");
        FormFile fichero = defaultForm.getUploadFile();
        EntityApp entityapp = catalogAPI.getCTDefaultEntityApp(entityId, getRealPath(""));

        // Comprobar si existe otra plantilla con el mismo nombre
        IItemCollection itemcol =
            catalogAPI.queryCTEntities(
                ICatalogAPI.ENTITY_CT_TEMPLATE,
                " WHERE NOMBRE = '" + DBUtil.replaceQuotes(name) + "'");
        if (itemcol.next() && !isGeneric(templateAPI, itemcol)) {
          ActionMessages errors = new ActionMessages();
          errors.add(
              "property(NOMBRE)",
              new ActionMessage("error.template.nameDuplicated", new String[] {name}));
          saveAppErrors(request, errors);

          return new ActionForward(mapping.getInput());
        }

        // Comprobar si existe otra plantilla con el mismo código
        if (StringUtils.isNotBlank(code)) {
          itemcol =
              catalogAPI.queryCTEntities(
                  ICatalogAPI.ENTITY_CT_TEMPLATE,
                  " WHERE COD_PLANT = '" + DBUtil.replaceQuotes(code) + "'");
          if (itemcol.next()) {
            ActionMessages errors = new ActionMessages();
            errors.add(
                "property(COD_PLANT)",
                new ActionMessage("error.template.codeDuplicated", new String[] {code}));
            saveAppErrors(request, errors);

            return new ActionForward(mapping.getInput());
          }
        }

        if (!entityapp.validate()) {

          ActionMessages errors = new ActionMessages();
          List errorList = entityapp.getErrors();
          Iterator iteError = errorList.iterator();
          while (iteError.hasNext()) {

            ValidationError validError = (ValidationError) iteError.next();
            ActionMessage error = new ActionMessage(validError.getErrorKey(), validError.getArgs());
            errors.add(ActionMessages.GLOBAL_MESSAGE, error);
          }
          saveAppErrors(request, errors);

          return new ActionForward(mapping.getInput());
        }

        if (fichero.getFileName().equals("")) {
          template = templateAPI.newTemplate(type, name, code, 0, expresion, null);
        } else {
          if (fichero.getFileSize() > 0) {

            // Comprobar si el tipo MIME de la plantilla está soportado
            String mimeType = MimetypeMapping.getFileMimeType(fichero.getFileName());
            // Se comprueba si esta habilitado el uso de plantillas ODT
            if (StringUtils.equals(mimeType, "application/vnd.oasis.opendocument.text")
                && !ConfigurationMgr.getVarGlobalBoolean(
                    session.getClientContext(), ConfigurationMgr.USE_ODT_TEMPLATES, false)) {
              throw new ISPACInfo(
                  getResources(request).getMessage("exception.template.odt.disabled"));
            }

            if (templateAPI.isMimeTypeSupported(mimeType)) {
              template =
                  templateAPI.newTemplate(
                      type, name, code, 0, expresion, fichero.getInputStream(), mimeType);
            } else {
              throw new ISPACInfo(
                  getResources(request).getMessage("exception.template.document.invalidFile"));
            }
          } else {
            throw new ISPACInfo("exception.uploadfile.empty");
          }
        }
      } else {
        EntityApp entityapp = catalogAPI.getCTDefaultEntityApp(entityId, getRealPath(""));

        // Comprobar si existe otra plantilla con el mismo nombre
        IItemCollection itemcol =
            catalogAPI.queryCTEntities(
                ICatalogAPI.ENTITY_CT_TEMPLATE,
                " WHERE NOMBRE = '" + DBUtil.replaceQuotes(name) + "' AND ID != " + keyId);
        if (itemcol.next() && !isGeneric(templateAPI, itemcol)) {
          ActionMessages errors = new ActionMessages();
          errors.add(
              "property(NOMBRE)",
              new ActionMessage("error.template.nameDuplicated", new String[] {name}));
          saveAppErrors(request, errors);

          return new ActionForward(mapping.getInput());
        }

        // Comprobar si existe otra plantilla con el mismo código
        if (StringUtils.isNotBlank(code)) {
          itemcol =
              catalogAPI.queryCTEntities(
                  ICatalogAPI.ENTITY_CT_TEMPLATE,
                  " WHERE COD_PLANT = '" + DBUtil.replaceQuotes(code) + "' AND ID != " + keyId);
          if (itemcol.next()) {
            ActionMessages errors = new ActionMessages();
            errors.add(
                "property(COD_PLANT)",
                new ActionMessage("error.template.codeDuplicated", new String[] {code}));
            saveAppErrors(request, errors);

            return new ActionForward(mapping.getInput());
          }
        }

        defaultForm.processEntityApp(entityapp);
        entityapp.getItem().set("FECHA", new Date());
        entityapp.store();
      }

    } catch (Exception e) {
      ActionForward action = mapping.findForward("success");
      String url =
          action.getPath()
              + "?entity="
              + entityId
              + "&type="
              + defaultForm.getProperty("ID_TPDOC")
              + "&key="
              + keyId;

      request.getSession().setAttribute(BaseAction.LAST_URL_SESSION_KEY, url);

      if (e instanceof ISPACInfo) {
        throw e;
      } else {
        throw new ISPACInfo(e.getMessage());
      }
    }

    if (template != null) {
      keyId = template.getInt("TEMPLATE:ID");
    }

    ActionForward action = mapping.findForward("success");
    String redirected =
        action.getPath()
            + "?entity="
            + entityId
            + "&type="
            + defaultForm.getProperty("ID_TPDOC")
            + "&key="
            + keyId;
    return new ActionForward(action.getName(), redirected, true);
  }