Пример #1
0
/**
 * @author Iecisa
 * @version $Revision$
 */
public class EdificioDBEntityImpl extends DBEntity implements IEdificioDBEntity {

  /** Nombre de la Tabla */
  public static final String TABLE_NAME = "ASGSEDIFICIO";

  /** Identificador */
  public static String ID_COLUMN_NAME = "ID";

  /** Nombre único en el sistema */
  public static String NOMBRE_COLUMN_NAME = "NOMBRE";

  /** Dirección del edificio */
  public static String UBICACION_COLUMN_NAME = "UBICACION";

  /** Identificador del archivo responsable de las salas de este edificio */
  public static String IDARCHIVO_COLUMN_NAME = "IDARCHIVO";

  public static final DbColumnDef ID_FIELD =
      new DbColumnDef(null, TABLE_NAME, ID_COLUMN_NAME, DbDataType.SHORT_TEXT, 32, false);

  public static final DbColumnDef NOMBRE_FIELD =
      new DbColumnDef(null, TABLE_NAME, NOMBRE_COLUMN_NAME, DbDataType.SHORT_TEXT, 64, false);

  public static final DbColumnDef UBICACION_FIELD =
      new DbColumnDef(null, TABLE_NAME, UBICACION_COLUMN_NAME, DbDataType.SHORT_TEXT, 254, true);

  public static final DbColumnDef IDARCHIVO_FIELD =
      new DbColumnDef(null, TABLE_NAME, IDARCHIVO_COLUMN_NAME, DbDataType.SHORT_TEXT, 32, false);

  public static final DbColumnDef[] TABLE_COLUMNS = {
    ID_FIELD, NOMBRE_FIELD, UBICACION_FIELD, IDARCHIVO_FIELD
  };

  public static final DbColumnDef[] TABLE_COLUMNS_UPDATE = {
    NOMBRE_FIELD, UBICACION_FIELD, IDARCHIVO_FIELD
  };

  DbColumnDef columnaNombreArchivo =
      new DbColumnDef(
          "nombreArchivo",
          new TableDef(ArchivoDbEntityImpl.TABLE_NAME, ArchivoDbEntityImpl.TABLE_NAME),
          ArchivoDbEntityImpl.NOMBRE_COLUMN_NAME,
          ArchivoDbEntityImpl.NOMBRE_FIELD.getDataType(),
          true);

  DbColumnDef[] COLS_DEF_QUERY =
      (DbColumnDef[]) ArrayUtils.concat(TABLE_COLUMNS, new DbColumnDef[] {columnaNombreArchivo});

  public static final String COLUM_NAMES_LIST = DbUtil.getColumnNames(TABLE_COLUMNS);

  /**
   * Obtiene el nombre de la tabla
   *
   * @return
   */
  public String getTableName() {
    return TABLE_NAME;
  }

  /** @param dataSource */
  public EdificioDBEntityImpl(DbDataSource dataSource) {
    super(dataSource);
  }

  public EdificioDBEntityImpl(DbConnection conn) {
    super(conn);
  }

  /**
   * {@inheritDoc}
   *
   * @see salas.db.IEdificioDBEntity#deleteEdificio(java.lang.String)
   */
  public void deleteEdificio(String idEdificio) {
    deleteVO(getQualById(idEdificio), TABLE_NAME);
  }

  /**
   * {@inheritDoc}
   *
   * @see salas.db.IEdificioDBEntity#getEdificioById(java.lang.String)
   */
  public EdificioVO getEdificioById(String idEdificio) {
    String qual = getQualById(idEdificio);
    return (EdificioVO) getVO(qual, getJoinCondition(), COLS_DEF_QUERY, EdificioVO.class);
  }

  /**
   * {@inheritDoc}
   *
   * @see salas.db.IEdificioDBEntity#getEdificioByNombre(java.lang.String)
   */
  public EdificioVO getEdificioByNombre(String nombre) {
    String qual = getQualByNombre(nombre);
    return (EdificioVO) getVO(qual, getJoinCondition(), COLS_DEF_QUERY, EdificioVO.class);
  }

  /**
   * {@inheritDoc}
   *
   * @see salas.db.IEdificioDBEntity#insertEdificio(salas.vos.EdificioVO)
   */
  public void insertEdificio(EdificioVO edificioVO) {
    edificioVO.setId(getGuid(edificioVO.getId()));
    insertVO(TABLE_NAME, TABLE_COLUMNS, edificioVO);
  }

  /**
   * {@inheritDoc}
   *
   * @see salas.db.IEdificioDBEntity#updateEdificio(salas.vos.EdificioVO)
   */
  public void updateEdificio(EdificioVO edificioVO) {
    updateVO(getQualById(edificioVO.getId()), TABLE_NAME, TABLE_COLUMNS_UPDATE, edificioVO);
  }

  /**
   * {@inheritDoc}
   *
   * @see salas.db.IEdificioDBEntity#getEdificios(java.lang.String[])
   */
  public List getEdificiosByIdsArchivo(String[] idsArchivo) {
    if (ArrayUtils.isNotEmpty(idsArchivo)) {
      StringBuffer qual =
          new StringBuffer().append(getQualByIdsArchivo(idsArchivo)).append(getDefaultOrderBy());
      return getDistinctVOS(qual.toString(), getJoinCondition(), COLS_DEF_QUERY, EdificioVO.class);
    }
    return null;
  }

  private String getQualById(String idEdificio) {
    StringBuffer qual =
        new StringBuffer(DBUtils.WHERE).append(DBUtils.generateEQTokenField(ID_FIELD, idEdificio));

    return qual.toString();
  }

  private String getQualByNombre(String nombre) {
    StringBuffer qual =
        new StringBuffer(DBUtils.WHERE).append(DBUtils.generateEQTokenField(NOMBRE_FIELD, nombre));

    return qual.toString();
  }

  private String getQualByIdsArchivo(String[] idsArchivo) {
    StringBuffer qual = new StringBuffer();

    if (ArrayUtils.isNotEmpty(idsArchivo)) {
      qual.append(DBUtils.WHERE).append(DBUtils.generateORTokens(IDARCHIVO_FIELD, idsArchivo));
    }

    return qual.toString();
  }

  private DbColumnDef getColumnaNumHijos(String salasConEquipoInformatico) {
    StringBuffer subQuery = new StringBuffer();
    subQuery
        .append("(")
        .append(DBUtils.SELECT)
        .append(DBUtils.COUNT_ALL)
        .append(DBUtils.FROM)
        .append(MesaDBEntityImpl.TABLE_NAME)
        .append(",")
        .append(SalaDBEntityImpl.TABLE_NAME)
        .append(DBUtils.WHERE)
        .append(
            DBUtils.generateJoinCondition(SalaDBEntityImpl.ID_FIELD, MesaDBEntityImpl.SALA_FIELD))
        .append(DBUtils.AND)
        .append(DBUtils.generateEQTokenField(MesaDBEntityImpl.ESTADO_FIELD, EstadoMesa.LIBRE));
    if (StringUtils.isNotEmpty(salasConEquipoInformatico)) {
      subQuery
          .append(DBUtils.AND)
          .append(
              DBUtils.generateEQTokenField(
                  SalaDBEntityImpl.EQUIPOINFORMATICO_FIELD, salasConEquipoInformatico));
    }
    subQuery
        .append(DBUtils.AND)
        .append(DBUtils.generateJoinCondition(SalaDBEntityImpl.EDIFICIO_FIELD, ID_FIELD))
        .append(")");

    DbColumnDef columnaNumHijos =
        new DbColumnDef("NumHijos", subQuery.toString(), DbDataType.SHORT_INTEGER);
    return columnaNumHijos;
  }

  private String getQualByNumHijos(String idArchivo) {
    /*
     * SELECT ASGSEDIFICIO.ID, ASGSEDIFICIO.NOMBRE, (SELECT COUNT(*) FROM
     * ASGSMESA ASGSMESA,ASGSSALA ASGSSALA WHERE ASGSMESA.IDSALA =
     * ASGSSALA.ID AND ASGSMESA.ESTADO='L' AND
     * ASGSSALA.EQUIPOINFORMATICO='equipoInformatico' AND
     * ASGSSALA.IDEDIFICIO = ASGSEDIFICIO.ID ) HIJOSEDIFICIO FROM
     * ASGSEDIFICIO ASGSEDIFICIO WHERE ASGSEDIFICIO.IDARCHIVO='idArchivo'
     * GROUP BY ASGSEDIFICIO.ID, ASGSEDIFICIO.NOMBRE ORDER BY
     * ASGSEDIFICIO.NOMBRE
     */
    StringBuffer qual =
        new StringBuffer(DBUtils.WHERE)
            .append(DBUtils.generateEQTokenField(IDARCHIVO_FIELD, idArchivo))
            .append(DBUtils.GROUPBY)
            .append(ID_FIELD.getQualifiedName())
            .append(", ")
            .append(NOMBRE_FIELD.getQualifiedName());

    return qual.toString();
  }

  private String getJoinCondition() {
    /*
     * SELECT ASGSEDIFICIO.*, AGARCHIVO.NOMBRE FROM ASGSEDIFICIO LEFT OUTER
     * JOIN AGARCHIVO ON AGARCHIVO.ID = ASGSEDIFICIO.IDARCHIVO;
     */
    JoinDefinition join = new JoinDefinition(IDARCHIVO_FIELD, ArchivoDbEntityImpl.ID_FIELD);
    StringBuffer fromSql =
        new StringBuffer()
            .append(
                DBUtils.generateLeftOuterJoinCondition(
                    new TableDef(TABLE_NAME), new JoinDefinition[] {join}));

    return fromSql.toString();
  }

  private String getQualByEdificioArchivoEquipoInformatico(
      String idEdificio, String idArchivo, String equipoInformatico) {
    StringBuffer qual =
        new StringBuffer(DBUtils.WHERE).append(DBUtils.generateEQTokenField(ID_FIELD, idEdificio));
    if (StringUtils.isNotEmpty(equipoInformatico)) {
      qual.append(DBUtils.AND)
          .append(
              DBUtils.generateEQTokenField(
                  SalaDBEntityImpl.EQUIPOINFORMATICO_FIELD, equipoInformatico));
    }
    qual.append(DBUtils.AND)
        .append(DBUtils.generateEQTokenField(IDARCHIVO_FIELD, idArchivo))
        .append(DBUtils.AND)
        .append(DBUtils.generateEQTokenField(MesaDBEntityImpl.ESTADO_FIELD, EstadoMesa.LIBRE))
        .append(DBUtils.ORDER_BY)
        .append(MesaDBEntityImpl.SALA_FIELD)
        .append(Constants.COMMA)
        .append(MesaDBEntityImpl.NUMORDEN_FIELD);

    return qual.toString();
  }

  private String getJoinConditionMesasLibres() {
    JoinDefinition joinEdificio = new JoinDefinition(ID_FIELD, SalaDBEntityImpl.EDIFICIO_FIELD);
    JoinDefinition joinMesa =
        new JoinDefinition(SalaDBEntityImpl.ID_FIELD, MesaDBEntityImpl.SALA_FIELD);
    StringBuffer fromSql =
        new StringBuffer()
            .append(
                DBUtils.generateLeftOuterJoinCondition(
                    new TableDef(TABLE_NAME), new JoinDefinition[] {joinEdificio, joinMesa}));

    return fromSql.toString();
  }

  private String getDefaultOrderBy() {
    return DBUtils.generateOrderBy(NOMBRE_FIELD);
  }

  /**
   * {@inheritDoc}
   *
   * @see salas.db.IEdificioDBEntity#countEdificiosByIdArchivo(java.lang.String)
   */
  public int getCountEdificiosByIdArchivo(String idArchivo) {
    if (StringUtils.isNotEmpty(idArchivo)) {
      String[] idsArchivo = new String[] {idArchivo};
      return getVOCount(getQualByIdsArchivo(idsArchivo), TABLE_NAME);
    } else return 0;
  }

  /**
   * {@inheritDoc}
   *
   * @see salas.db.IEdificioDBEntity#getEdificios()
   */
  public List getEdificios() {
    String qual = getDefaultOrderBy();
    return getDistinctVOS(qual.toString(), getJoinCondition(), COLS_DEF_QUERY, EdificioVO.class);
  }

  /**
   * {@inheritDoc}
   *
   * @see salas.db.IEdificioDBEntity#getMesasLibresEdificio(java.lang.String, java.lang.String)
   */
  public List getMesasLibresEdificio(String idArchivo, String salasConEquipoInformatico) {
    DbColumnDef[] cols =
        new DbColumnDef[] {ID_FIELD, NOMBRE_FIELD, getColumnaNumHijos(salasConEquipoInformatico)};
    StringBuffer qual = new StringBuffer(getQualByNumHijos(idArchivo)).append(getDefaultOrderBy());
    return getVOS(qual.toString(), TABLE_NAME, cols, ElementoNavegacionVO.class);
  }

  /**
   * {@inheritDoc}
   *
   * @see salas.db.IEdificioDBEntity#getMesasLibresByEdificio(java.lang.String, java.lang.String,
   *     java.lang.String)
   */
  public List getMesasLibresByEdificio(
      final String idArchivo, final String idSala, final String salasConEquipoInformatico) {
    /*
     * SELECT ASGSMESA.* FROM ASGSEDIFICIO LEFT OUTER JOIN ASGSSALA ON
     * ASGSSALA.IDEDIFICIO=ASGSEDIFICIO.ID LEFT OUTER JOIN ASGSMESA ON
     * ASGSMESA.IDSALA = ASGSSALA.ID WHERE ASGSEDIFICIO.ID='idEdificio' AND
     * ASGSMESA.ESTADO='L' AND
     * ASGSSALA.EQUIPOINFORMATICO='salaConEquipoInformatico' AND
     * ASGSEDIFICIO.IDARCHIVO='idArchivo' ORDER BY
     * ASGSSALA.NOMBRE,ASGSMESA.NUMORDEN
     */
    String qual =
        getQualByEdificioArchivoEquipoInformatico(idSala, idArchivo, salasConEquipoInformatico);
    return getVOS(
        qual, getJoinConditionMesasLibres(), MesaDBEntityImpl.TABLE_COLUMNS, MesaVO.class);
  }
}
/** DBEntity para acceder a la tabla ADOCDOCUMENTOCF. */
public class DocDocumentoCFDBEntityImpl extends DBEntity implements IDocDocumentoCFDBEntity {
  /** Nombre de la tabla. */
  public static final String TABLE_NAME = "ADOCDOCUMENTOCF";

  /** Nombre de columnas */
  public static final String ID_COLUMN_NAME = "id";

  public static final String NOMBRE_COLUMN_NAME = "nombre";
  public static final String ID_CLF_PADRE_COLUMN_NAME = "idclfpadre";
  public static final String ID_ELEMENTO_CF_COLUMN_NAME = "idelementocf";
  public static final String TAMANO_FICH_COLUMN_NAME = "tamanofich";
  public static final String NOMBRE_ORG_FICH_COLUMN_NAME = "nombreorgfich";
  public static final String EXT_FICH_COLUMN_NAME = "extfich";
  public static final String ID_EXT_DEPOSITO_COLUMN_NAME = "idextdeposito";
  public static final String ID_FICH_COLUMN_NAME = "idfich";
  public static final String ESTADO_COLUMN_NAME = "estado";
  public static final String DESCRIPCION_COLUMN_NAME = "descripcion";
  public static final String ID_REP_ECM_COLUMN_NAME = "idRepEcm";

  /** Definiciones de columnas */
  public static final DbColumnDef CAMPO_ID =
      new DbColumnDef(null, TABLE_NAME, ID_COLUMN_NAME, DbDataType.SHORT_TEXT, 32, false);

  public static final DbColumnDef CAMPO_NOMBRE =
      new DbColumnDef(null, TABLE_NAME, NOMBRE_COLUMN_NAME, DbDataType.SHORT_TEXT, 128, false);
  public static final DbColumnDef CAMPO_ID_CLF_PADRE =
      new DbColumnDef(null, TABLE_NAME, ID_CLF_PADRE_COLUMN_NAME, DbDataType.SHORT_TEXT, 32, true);
  public static final DbColumnDef CAMPO_ID_ELEMENTO_CF =
      new DbColumnDef(
          "idobjeto", TABLE_NAME, ID_ELEMENTO_CF_COLUMN_NAME, DbDataType.SHORT_TEXT, 32, false);
  public static final DbColumnDef CAMPO_TAMANO_FICH =
      new DbColumnDef(null, TABLE_NAME, TAMANO_FICH_COLUMN_NAME, DbDataType.LONG_DECIMAL, false);
  public static final DbColumnDef CAMPO_NOMBRE_ORG_FICH =
      new DbColumnDef(
          null, TABLE_NAME, NOMBRE_ORG_FICH_COLUMN_NAME, DbDataType.SHORT_TEXT, 254, false);
  public static final DbColumnDef CAMPO_EXT_FICH =
      new DbColumnDef(null, TABLE_NAME, EXT_FICH_COLUMN_NAME, DbDataType.SHORT_TEXT, 16, false);
  public static final DbColumnDef CAMPO_ID_EXT_DEPOSITO =
      new DbColumnDef(
          null, TABLE_NAME, ID_EXT_DEPOSITO_COLUMN_NAME, DbDataType.SHORT_TEXT, 32, false);
  public static final DbColumnDef CAMPO_ID_FICH =
      new DbColumnDef(null, TABLE_NAME, ID_FICH_COLUMN_NAME, DbDataType.SHORT_TEXT, 128, false);
  public static final DbColumnDef CAMPO_ESTADO =
      new DbColumnDef(null, TABLE_NAME, ESTADO_COLUMN_NAME, DbDataType.LONG_INTEGER, false);
  public static final DbColumnDef CAMPO_DESCRIPCION =
      new DbColumnDef(null, TABLE_NAME, DESCRIPCION_COLUMN_NAME, DbDataType.SHORT_TEXT, 254, true);
  public static final DbColumnDef CAMPO_ID_REP_ECM =
      new DbColumnDef(null, TABLE_NAME, ID_REP_ECM_COLUMN_NAME, DbDataType.SHORT_TEXT, 32, false);

  /** Lista de columnas. */
  public static final DbColumnDef[] COL_DEFS = {
    CAMPO_ID,
    CAMPO_NOMBRE,
    CAMPO_ID_CLF_PADRE,
    CAMPO_ID_ELEMENTO_CF,
    CAMPO_TAMANO_FICH,
    CAMPO_NOMBRE_ORG_FICH,
    CAMPO_EXT_FICH,
    CAMPO_ID_EXT_DEPOSITO,
    CAMPO_ID_FICH,
    CAMPO_ESTADO,
    CAMPO_DESCRIPCION,
    CAMPO_ID_REP_ECM
  };

  /** Lista de nombres de columnas. */
  public static final String COL_NAMES = DbUtil.getColumnNames(COL_DEFS);

  /**
   * Obtiene el nombre de la tabla
   *
   * @return
   */
  public String getTableName() {
    return TABLE_NAME;
  }

  /**
   * Constructor.
   *
   * @param dataSource Pool de conexiones de base de datos.
   */
  public DocDocumentoCFDBEntityImpl(DbDataSource dataSource) {
    super(dataSource);
  }

  public DocDocumentoCFDBEntityImpl(DbConnection conn) {
    super(conn);
  }

  /**
   * Obtiene la lista de documentos electrónicos de un elemento del cuadro de clasificación.
   *
   * @param idElementoCF Identificador del elemento del cuadro de clasificación.
   * @param idClfPadre Identificador del clasificador padre.
   * @param estados Lista de estados de los documentos.
   * @return Listas de documentos electrónicos.
   */
  public List getDocumentos(String idElementoCF, String idClfPadre, int[] estados) {

    // HashMap pairs = new HashMap();
    // pairs.put(TABLE_NAME,COL_DEFS);
    // pairs.put(DepositoElectronicoDBEntityImpl.TABLE_NAME,
    // new DbColumnDef [] {
    // new DbColumnDef("nombreDeposito",
    // DepositoElectronicoDBEntityImpl.CAMPO_NOMBRE) });
    // TODO ZMIGRACION BD - OUTER JOIN (PROBADO
    StringBuffer qual = new StringBuffer().append(" WHERE ");
    // .append(DBUtils.generateOuterJoinCondition(
    // DepositoElectronicoDBEntityImpl.CAMPO_ID_EXT,
    // CAMPO_ID_EXT_DEPOSITO))
    // .append(" AND ");

    if (StringUtils.isNotBlank(idElementoCF))
      qual.append(DBUtils.generateEQTokenField(CAMPO_ID_ELEMENTO_CF, idElementoCF)).append(" AND ");

    qual.append(DBUtils.generateEQTokenField(CAMPO_ID_CLF_PADRE, idClfPadre));

    if ((estados != null) && (estados.length > 0))
      qual.append(" AND ").append(DBUtils.generateInTokenField(CAMPO_ESTADO, estados));

    qual.append(" ORDER BY ").append(CAMPO_NOMBRE.getQualifiedName());

    TableDef tablaDocElectronicos = new TableDef(TABLE_NAME);
    JoinDefinition[] joins =
        new JoinDefinition[] {
          new JoinDefinition(
              new DbColumnDef(tablaDocElectronicos, CAMPO_ID_EXT_DEPOSITO),
              new DbColumnDef(
                  new TableDef(DepositoElectronicoDBEntityImpl.TABLE_NAME),
                  DepositoElectronicoDBEntityImpl.CAMPO_ID_EXT)),
        };

    StringBuffer sqlFrom = new StringBuffer();
    sqlFrom.append(DBUtils.generateLeftOuterJoinCondition(tablaDocElectronicos, joins));

    DbColumnDef[] COLS_DEF_QUERY =
        (DbColumnDef[])
            ArrayUtils.concat(
                new DbColumnDef[] {DepositoElectronicoDBEntityImpl.CAMPO_NOMBRE}, COL_DEFS);

    // List documentos = getVOS(qual.toString(), pairs,
    // DocDocumentoVO.class);
    List documentos =
        getVOS(qual.toString(), sqlFrom.toString(), COLS_DEF_QUERY, DocDocumentoVO.class);
    for (int i = 0; i < documentos.size(); i++)
      ((DocDocumentoVO) documentos.get(i)).setTipoObjeto(TipoObjeto.ELEMENTO_CF);

    return documentos;
  }

  /**
   * Cuenta el número de documentos asociados a un elemento del cuadro de clasificación
   *
   * @param idElementoCF Identificador de elemento del cuadro de clasificación
   * @return Número de documentos asociados al elemento
   */
  public int countNumDocumentos(String idElementoCF) {
    StringBuffer qual =
        new StringBuffer("WHERE ")
            .append(DBUtils.generateEQTokenField(CAMPO_ID_ELEMENTO_CF, idElementoCF));
    return getVOCount(qual.toString(), TABLE_NAME);
  }

  /**
   * Obtiene la lista de documentos electrónicos de un elemento del cuadro de clasificación.
   *
   * @param idElementoCF Identificador del elemento del cuadro de clasificación.
   * @return Listas de documentos electrónicos.
   */
  public List getDocumentos(String idElementoCF) {
    // HashMap pairs = new HashMap();
    // pairs.put(TABLE_NAME,COL_DEFS);
    // pairs.put(DepositoElectronicoDBEntityImpl.TABLE_NAME,
    // new DbColumnDef [] {
    // new DbColumnDef("nombreDeposito",
    // DepositoElectronicoDBEntityImpl.CAMPO_NOMBRE) });
    // TODO ZMIGRACION BD - OUTER JOIN (SIN PROBAR - HAY QUE TESTEARLO CON
    // EL PROCESO BATCH DE BORRAR U.DOC. NO DEVUELTAS ... ¿IMPLEMENTADO?
    StringBuffer qual =
        new StringBuffer()
            .append(" WHERE ")
            // .append(DBUtils.generateOuterJoinCondition(DepositoElectronicoDBEntityImpl.CAMPO_ID_EXT,
            // CAMPO_ID_EXT_DEPOSITO))
            // .append(" AND ")
            .append(DBUtils.generateEQTokenField(CAMPO_ID_ELEMENTO_CF, idElementoCF));

    TableDef tablaDocElectronicos = new TableDef(TABLE_NAME);
    JoinDefinition[] joins =
        new JoinDefinition[] {
          new JoinDefinition(
              new DbColumnDef(tablaDocElectronicos, CAMPO_ID_EXT_DEPOSITO),
              new DbColumnDef(
                  new TableDef(DepositoElectronicoDBEntityImpl.TABLE_NAME),
                  DepositoElectronicoDBEntityImpl.CAMPO_ID_EXT)),
        };

    StringBuffer sqlFrom = new StringBuffer();
    sqlFrom.append(DBUtils.generateLeftOuterJoinCondition(tablaDocElectronicos, joins));

    DbColumnDef[] COLS_DEF_QUERY =
        (DbColumnDef[])
            ArrayUtils.concat(
                new DbColumnDef[] {DepositoElectronicoDBEntityImpl.CAMPO_NOMBRE}, COL_DEFS);

    List documentos =
        getVOS(qual.toString(), sqlFrom.toString(), COLS_DEF_QUERY, DocDocumentoVO.class);
    //
    // List documentos = getVOS(qual.toString(), pairs,
    // DocDocumentoVO.class);
    for (int i = 0; i < documentos.size(); i++)
      ((DocDocumentoVO) documentos.get(i)).setTipoObjeto(TipoObjeto.ELEMENTO_CF);

    return documentos;
  }

  /**
   * Obtiene el documento electrónico.
   *
   * @param id Identificador del documento electrónico.
   * @return Documento electrónico.
   */
  public DocDocumentoVO getDocumento(String id) {
    // HashMap pairs = new HashMap();
    // pairs.put(TABLE_NAME,COL_DEFS);
    // pairs.put(DepositoElectronicoDBEntityImpl.TABLE_NAME,
    // new DbColumnDef [] {
    // new DbColumnDef("nombreDeposito",
    // DepositoElectronicoDBEntityImpl.CAMPO_NOMBRE) });
    // TODO ZMIGRACION BD - OUTER JOIN (PROBADO
    String qual =
        new StringBuffer()
            .append(" WHERE ")
            // .append(DBUtils.generateOuterJoinCondition(DepositoElectronicoDBEntityImpl.CAMPO_ID_EXT,
            // CAMPO_ID_EXT_DEPOSITO))
            // .append(" AND ")
            .append(DBUtils.generateEQTokenField(CAMPO_ID, id))
            .toString();

    TableDef tablaDocElectronicos = new TableDef(TABLE_NAME);
    JoinDefinition[] joins =
        new JoinDefinition[] {
          new JoinDefinition(
              new DbColumnDef(tablaDocElectronicos, CAMPO_ID_EXT_DEPOSITO),
              new DbColumnDef(
                  new TableDef(DepositoElectronicoDBEntityImpl.TABLE_NAME),
                  DepositoElectronicoDBEntityImpl.CAMPO_ID_EXT)),
        };

    StringBuffer sqlFrom = new StringBuffer();
    sqlFrom.append(DBUtils.generateLeftOuterJoinCondition(tablaDocElectronicos, joins));

    DbColumnDef[] COLS_DEF_QUERY =
        (DbColumnDef[])
            ArrayUtils.concat(
                new DbColumnDef[] {DepositoElectronicoDBEntityImpl.CAMPO_NOMBRE}, COL_DEFS);

    DocDocumentoVO documento =
        (DocDocumentoVO) getVO(qual, sqlFrom.toString(), COLS_DEF_QUERY, DocDocumentoVO.class);

    // DocDocumentoVO documento = (DocDocumentoVO) getVO(qual, pairs,
    // DocDocumentoVO.class);
    if (documento != null) documento.setTipoObjeto(TipoObjeto.ELEMENTO_CF);

    return documento;
  }

  /**
   * Crea un documento electrónico.
   *
   * @param documento Documento electrónico.
   */
  public DocDocumentoVO insertDocumento(DocDocumentoVO documento) {
    documento.setId(getGuid(documento.getId()));
    insertVO(TABLE_NAME, COL_DEFS, documento);
    return documento;
  }

  /**
   * Modifica un documento electrónico.
   *
   * @param documento Documento electrónico.
   */
  public void updateDocumento(DocDocumentoVO documento) {
    String qual =
        new StringBuffer()
            .append(" WHERE ")
            .append(DBUtils.generateEQTokenField(CAMPO_ID, documento.getId()))
            .toString();

    updateVO(qual, TABLE_NAME, COL_DEFS, documento);
  }

  /**
   * Elimina un documento electrónico.
   *
   * @param id Identificador del documento electrónico.
   */
  public void deleteDocumento(String id) {
    String qual =
        new StringBuffer()
            .append(" WHERE ")
            .append(DBUtils.generateEQTokenField(CAMPO_ID, id))
            .toString();

    deleteVO(qual, TABLE_NAME);
  }

  /**
   * Elimina los documentos de un elemento del cuadro de clasificación.
   *
   * @param idElementoCF Identificador del elemento del cuadro de clasificación.
   */
  public void deleteDocumentos(String idElementoCF) {
    String qual =
        new StringBuffer()
            .append(" WHERE ")
            .append(DBUtils.generateEQTokenField(CAMPO_ID_ELEMENTO_CF, idElementoCF))
            .toString();

    deleteVO(qual, TABLE_NAME);
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * docelectronicos.db.IDocDocumentoCFDBEntity#getDocumentos(java.lang.String
   * , int[])
   */
  public List getDocumentos(String idElementoCF, int[] estados) {
    // HashMap pairs = new HashMap();
    // pairs.put(TABLE_NAME,COL_DEFS);
    // pairs.put(DepositoElectronicoDBEntityImpl.TABLE_NAME,
    // new DbColumnDef [] {
    // new DbColumnDef("nombreDeposito",
    // DepositoElectronicoDBEntityImpl.CAMPO_NOMBRE) });
    // // TODO ZMIGRACION BD - OUTER JOIN (PROBADO
    StringBuffer qual = new StringBuffer().append(" WHERE 1=1 ");
    // .append(DBUtils.generateOuterJoinCondition(DepositoElectronicoDBEntityImpl.CAMPO_ID_EXT,
    // CAMPO_ID_EXT_DEPOSITO));

    if (StringUtils.isNotBlank(idElementoCF))
      qual.append(" AND ").append(DBUtils.generateEQTokenField(CAMPO_ID_ELEMENTO_CF, idElementoCF));

    if ((estados != null) && (estados.length > 0))
      qual.append(" AND ").append(DBUtils.generateInTokenField(CAMPO_ESTADO, estados));

    qual.append(" ORDER BY ").append(CAMPO_NOMBRE.getQualifiedName());

    TableDef tablaDocElectronicos = new TableDef(TABLE_NAME);
    JoinDefinition[] joins =
        new JoinDefinition[] {
          new JoinDefinition(
              new DbColumnDef(tablaDocElectronicos, CAMPO_ID_EXT_DEPOSITO),
              new DbColumnDef(
                  new TableDef(DepositoElectronicoDBEntityImpl.TABLE_NAME),
                  DepositoElectronicoDBEntityImpl.CAMPO_ID_EXT)),
        };

    StringBuffer sqlFrom = new StringBuffer();
    sqlFrom.append(DBUtils.generateLeftOuterJoinCondition(tablaDocElectronicos, joins));

    DbColumnDef[] COLS_DEF_QUERY =
        (DbColumnDef[])
            ArrayUtils.concat(
                new DbColumnDef[] {DepositoElectronicoDBEntityImpl.CAMPO_NOMBRE}, COL_DEFS);

    // List documentos = getVOS(qual.toString(), pairs,
    // DocDocumentoVO.class);
    List documentos =
        getVOS(qual.toString(), sqlFrom.toString(), COLS_DEF_QUERY, DocDocumentoVO.class);

    // List documentos = getVOS(qual.toString(), pairs,
    // DocDocumentoVO.class);
    for (int i = 0; i < documentos.size(); i++)
      ((DocDocumentoVO) documentos.get(i)).setTipoObjeto(TipoObjeto.ELEMENTO_CF);

    return documentos;
  }

  /*
   * (non-Javadoc)
   *
   * @see docelectronicos.db.IDocDocumentoCFDBEntity#update(java.lang.String,
   * int[], int)
   */
  public void update(String idObj, int[] estadosAActualizar, int nuevoEstado) {
    StringBuffer qual = new StringBuffer().append(" WHERE ");

    if (StringUtils.isNotBlank(idObj))
      qual.append(DBUtils.generateEQTokenField(CAMPO_ID_ELEMENTO_CF, idObj));

    if ((estadosAActualizar != null) && (estadosAActualizar.length > 0))
      qual.append(" AND ").append(DBUtils.generateInTokenField(CAMPO_ESTADO, estadosAActualizar));

    HashMap colToUpdate = new HashMap();
    colToUpdate.put(CAMPO_ESTADO, new Integer(nuevoEstado));
    updateFields(qual.toString(), colToUpdate, TABLE_NAME);
  }

  /**
   * Obtiene el número de documentos almacenados en un depósito electrónico.
   *
   * @param idExtDeposito Identificador externo del depósito electrónico.
   * @return Número de documentos.
   */
  public int getCountDocumentosByIdExtDeposito(String idExtDeposito) {
    String qual =
        new StringBuffer()
            .append(" WHERE ")
            .append(DBUtils.generateEQTokenField(CAMPO_ID_EXT_DEPOSITO, idExtDeposito))
            .toString();

    return getVOCount(qual, TABLE_NAME);
  }

  /**
   * Obtiene la lista de documentos electrónicos de un elemento del cuadro de clasificación.
   *
   * @param idElementoCF Identificador del elemento del cuadro de clasificación.
   * @param idClfPadre Identificador del clasificador padre.
   * @return Listas de documentos electrónicos.
   */
  public int getCountDocumentosByIdClfPadre(String idElementoCF, String idClfPadre) {
    int ret = 0;

    StringBuffer qual = new StringBuffer().append(" WHERE ");

    if (StringUtils.isNotBlank(idElementoCF))
      qual.append(DBUtils.generateEQTokenField(CAMPO_ID_ELEMENTO_CF, idElementoCF)).append(" AND ");

    qual.append(DBUtils.generateEQTokenField(CAMPO_ID_CLF_PADRE, idClfPadre));

    ret = getVOCount(qual.toString(), TABLE_NAME);

    return ret;
  }

  /**
   * Obtiene un Map cuyas claves son los ids de elementos del cuadro y sus valores la lista de
   * identificadores de documentos electrónicos asociados a una lista de elementos del cuadro de
   * clasificación.
   *
   * @param idsElementosCF Identificador de la lista de ids de elementos del cuadro de
   *     clasificación.
   * @return Listas de identificadores de documentos electrónicos.
   */
  public Map getDocumentos(List idsElementosCF) {
    Map idsDocumentos = new HashMap();

    StringBuffer qual =
        new StringBuffer()
            .append(" WHERE ")
            .append(DBUtils.generateInTokenField(CAMPO_ID_ELEMENTO_CF, idsElementosCF));

    TableDef tablaDocElectronicos = new TableDef(TABLE_NAME);

    StringBuffer sqlFrom = new StringBuffer().append(tablaDocElectronicos.getDeclaration());

    DbColumnDef[] COLS_DEF_QUERY = new DbColumnDef[] {CAMPO_ID_ELEMENTO_CF, CAMPO_ID_FICH};

    List documentos =
        getVOS(qual.toString(), sqlFrom.toString(), COLS_DEF_QUERY, DocDocumentoVO.class);

    for (int i = 0; i < documentos.size(); i++) {
      DocDocumentoVO documento = ((DocDocumentoVO) documentos.get(i));

      Object obj = idsDocumentos.get(documento.getIdObjeto());
      ArrayList elem = null;
      if (obj != null) elem = (ArrayList) obj;
      else elem = new ArrayList();

      elem.add(documento.getIdFich());
      idsDocumentos.put(documento.getIdObjeto(), elem);
    }

    return idsDocumentos;
  }

  public DocDocumentoVO getDocumentoByIdInterno(String idInterno) {
    String qual =
        new StringBuffer()
            .append(" WHERE ")
            .append(DBUtils.generateEQTokenField(CAMPO_ID_FICH, idInterno))
            .toString();

    TableDef tablaDocElectronicos = new TableDef(TABLE_NAME);
    JoinDefinition[] joins =
        new JoinDefinition[] {
          new JoinDefinition(
              new DbColumnDef(tablaDocElectronicos, CAMPO_ID_EXT_DEPOSITO),
              new DbColumnDef(
                  new TableDef(DepositoElectronicoDBEntityImpl.TABLE_NAME),
                  DepositoElectronicoDBEntityImpl.CAMPO_ID_EXT)),
        };

    StringBuffer sqlFrom = new StringBuffer();
    sqlFrom.append(DBUtils.generateLeftOuterJoinCondition(tablaDocElectronicos, joins));

    DbColumnDef[] COLS_DEF_QUERY =
        (DbColumnDef[])
            ArrayUtils.concat(
                new DbColumnDef[] {DepositoElectronicoDBEntityImpl.CAMPO_NOMBRE}, COL_DEFS);

    DocDocumentoVO documento =
        (DocDocumentoVO) getVO(qual, sqlFrom.toString(), COLS_DEF_QUERY, DocDocumentoVO.class);
    if (documento != null) documento.setTipoObjeto(TipoObjeto.ELEMENTO_CF);

    return documento;
  }

  public static String getCountSQL(DbColumnDef columna, String nombreColumna) {
    /*
     * SELECT COUNT(1) FROM adocdocumentocf adocdocumentocf WHERE
     * ELEMENTOCF.id=adocdocumentocf.idelementocf
     */

    StringBuffer sql =
        new StringBuffer(DBUtils.ABRIR_PARENTESIS)
            .append(DBUtils.SELECT)
            .append(DBUtils.getCountDefault())
            .append(DBUtils.FROM)
            .append(new TableDef(TABLE_NAME).getDeclaration())
            .append(DBUtils.WHERE)
            .append(DBUtils.generateEQTokenField1(columna, CAMPO_ID_ELEMENTO_CF))
            .append(DBUtils.CERRAR_PARENTESIS)
            .append(Constants.STRING_SPACE)
        // .append(nombreColumna)
        ;

    return sql.toString();
  }

  /**
   * {@inheritDoc}
   *
   * @see docelectronicos.db.IDocDocumentoCFDBEntity#updateIdElementocf(java.lang.String,
   *     java.lang.String, java.lang.String[])
   */
  public void updateIdElementocf(
      String idElementocfAntiguo, String idElementoCfNuevo, String[] idsInternosDocumentos) {

    StringBuilder qual =
        new StringBuilder(DBUtils.WHERE)
            .append(DBUtils.generateEQTokenField(CAMPO_ID_ELEMENTO_CF, idElementocfAntiguo))
            .append(DBUtils.AND)
            .append(DBUtils.generateInTokenField(CAMPO_ID, idsInternosDocumentos));

    HashMap colToUpdate = new HashMap();
    colToUpdate.put(CAMPO_ID_ELEMENTO_CF, idElementoCfNuevo);
    updateFields(qual.toString(), colToUpdate, TABLE_NAME);
  }
}
/** DBEntity para acceder a la tabla ASCAUSRGRP. */
public class GrupoUsuarioDBEntityImpl extends DBEntity implements IGrupoUsuarioDBEntity {

  /** Constantes de mapeo con la base de datos */
  public static final String TABLE_NAME = "ASCAUSRGRP";

  /** Nombre de columnas */
  public static final String ID_USUARIO_COLUMN_NAME = "idusuario";

  public static final String ID_GRUPO_COLUMN_NAME = "idgrupo";

  /** Definiciones de columna */
  public static final DbColumnDef CAMPO_ID_USUARIO =
      new DbColumnDef(null, TABLE_NAME, ID_USUARIO_COLUMN_NAME, DbDataType.SHORT_TEXT, 32, false);

  public static final DbColumnDef CAMPO_ID_GRUPO =
      new DbColumnDef(null, TABLE_NAME, ID_GRUPO_COLUMN_NAME, DbDataType.SHORT_TEXT, 32, false);

  /** Lista de columnas. */
  public static final DbColumnDef[] COL_DEFS = new DbColumnDef[] {CAMPO_ID_USUARIO, CAMPO_ID_GRUPO};

  /** Lista de nombres de columnas. */
  public static final String COLUM_NAMES_LIST = DbUtil.getColumnNames(COL_DEFS);

  /**
   * Obtiene el nombre de la tabla
   *
   * @return
   */
  public String getTableName() {
    return TABLE_NAME;
  }

  /**
   * Constructor.
   *
   * @param dataSource Pool de conexiones de base de datos.
   */
  public GrupoUsuarioDBEntityImpl(DbDataSource dataSource) {
    super(dataSource);
  }

  public GrupoUsuarioDBEntityImpl(DbConnection conn) {
    super(conn);
  }

  /**
   * Obtiene los grupos del usuario.
   *
   * @param idUsuario Identificador del usuario.
   * @return Grupos del usuario.
   */
  public List getGruposUsuario(String idUsuario) {
    StringBuffer qual =
        new StringBuffer()
            .append("WHERE ")
            .append(DBUtils.generateEQTokenField(CAMPO_ID_USUARIO, idUsuario))
            .append(" AND ")
            .append(
                DBUtils.generateJoinCondition(
                    TABLE_NAME,
                    CAMPO_ID_GRUPO,
                    GrupoDBEntityImpl.TABLE_NAME,
                    GrupoDBEntityImpl.CAMPO_ID))
            .append(" ORDER BY ")
            .append(GrupoDBEntityImpl.CAMPO_NOMBRE.getName());

    HashMap pairsTableNameColsDefs = new HashMap();
    pairsTableNameColsDefs.put(TABLE_NAME, new DbColumnDef[0]);
    pairsTableNameColsDefs.put(GrupoDBEntityImpl.TABLE_NAME, GrupoDBEntityImpl.COL_DEFS);

    return getVOS(qual.toString(), pairsTableNameColsDefs, GrupoVO.class);
  }

  /**
   * Obtiene los usuarios que pertenecen a un grupo
   *
   * @param idGrupo Identificador de grupo
   * @return Lista de usuarios {@link gcontrol.vos.UsuarioVO}
   */
  public List getUsuariosGrupo(String idGrupo) {
    StringBuffer qual =
        new StringBuffer("WHERE ")
            .append(DBUtils.generateEQTokenField(CAMPO_ID_GRUPO, idGrupo))
            .append(" AND ")
            .append(DBUtils.generateJoinCondition(CAMPO_ID_USUARIO, UsuarioDBEntityImpl.CAMPO_ID));
    String[] queryTables = {TABLE_NAME, UsuarioDBEntityImpl.TABLE_NAME};
    return getVOS(
        qual.toString(),
        ArrayUtils.join(queryTables, ","),
        UsuarioDBEntityImpl.COL_DEFS,
        UsuarioVO.class);
  }

  /**
   * Incorpora un usuario a un grupo
   *
   * @param idGrupo Identificador de grupo
   * @param idUsuario Identificador de usuario
   */
  public void insertGrupoUsuario(String idGrupo, String idUsuario) {
    final GrupoUsuarioVO grupoUsuario = new GrupoUsuarioVO(idUsuario, idGrupo);
    DBCommand command =
        new DBCommand(this) {
          public void codeLogic(DbConnection conn) throws Exception {
            SigiaDbInputRecord inputRecord = new SigiaDbInputRecord(COL_DEFS, grupoUsuario);
            DbInsertFns.insert(conn, TABLE_NAME, COLUM_NAMES_LIST, inputRecord);
          }
        };
    command.execute();
  }

  /**
   * Elimina un conjunto de usuarios de un grupo
   *
   * @param idGrupo Identificador de grupo
   * @param idUsuario Lista de identificadores de usuario. En caso de ser null se eliminaran todos
   *     los usuarios del grupo
   */
  public void removeGrupoUsuario(String idGrupo, String[] idUsuario) {
    StringBuffer qual =
        new StringBuffer("WHERE ").append(DBUtils.generateEQTokenField(CAMPO_ID_GRUPO, idGrupo));
    if (idUsuario != null)
      qual.append(" AND ").append(DBUtils.generateInTokenField(CAMPO_ID_USUARIO, idUsuario));
    deleteVO(qual.toString(), TABLE_NAME);
  }

  public class GrupoUsuarioVO {
    String idUsuario = null;
    String idGrupo = null;

    GrupoUsuarioVO(String idUsuario, String idGrupo) {
      super();
      this.idUsuario = idUsuario;
      this.idGrupo = idGrupo;
    }

    public String getIdGrupo() {
      return idGrupo;
    }

    public String getIdUsuario() {
      return idUsuario;
    }
  }
}