private String generateFields(final Collection colPresentation) throws Exception {
    final ObjetoNegocioDao objetoNegocioDao = new ObjetoNegocioDao();
    String sqlFields = "";
    if (colPresentation != null) {
      int i = 1;
      for (final Iterator it = colPresentation.iterator(); it.hasNext(); ) {
        final GrupoVisaoCamposNegocioDTO grupoVisaoCamposNegocioDTO =
            (GrupoVisaoCamposNegocioDTO) it.next();
        final CamposObjetoNegocioDTO camposObjetoNegocioDTO =
            grupoVisaoCamposNegocioDTO.getCamposObjetoNegocioDto();
        ObjetoNegocioDTO objetoNegocioDTO = new ObjetoNegocioDTO();

        objetoNegocioDTO.setIdObjetoNegocio(camposObjetoNegocioDTO.getIdObjetoNegocio());
        objetoNegocioDTO = (ObjetoNegocioDTO) objetoNegocioDao.restore(objetoNegocioDTO);

        if (objetoNegocioDTO != null) {
          if (!sqlFields.equalsIgnoreCase("")) {
            sqlFields += ", ";
          }
          sqlFields +=
              objetoNegocioDTO.getNomeTabelaDB()
                  + "."
                  + camposObjetoNegocioDTO.getNomeDB()
                  + " Fld_"
                  + i;
        }
        i++;
      }
    }
    return sqlFields;
  }
  public String generateFrom(final Collection colGeral) throws Exception {
    final ObjetoNegocioDao objetoNegocioDao = new ObjetoNegocioDao();
    final Map map = new HashMap<>();

    if (colGeral != null) {
      for (final Iterator it = colGeral.iterator(); it.hasNext(); ) {
        final CamposObjetoNegocioDTO camposObjetoNegocioDTO = (CamposObjetoNegocioDTO) it.next();
        ObjetoNegocioDTO objetoNegocioDTO = new ObjetoNegocioDTO();

        objetoNegocioDTO.setIdObjetoNegocio(camposObjetoNegocioDTO.getIdObjetoNegocio());
        objetoNegocioDTO = (ObjetoNegocioDTO) objetoNegocioDao.restore(objetoNegocioDTO);

        if (objetoNegocioDTO != null) {
          if (!map.containsKey(objetoNegocioDTO.getNomeTabelaDB())) {
            map.put(objetoNegocioDTO.getNomeTabelaDB(), objetoNegocioDTO.getNomeTabelaDB());
          }
        }
      }
    }

    final Set set = map.entrySet();
    final Iterator i = set.iterator();

    String fromSql = "";
    while (i.hasNext()) {
      final Map.Entry me = (Map.Entry) i.next();
      if (!fromSql.equalsIgnoreCase("")) {
        fromSql += ",";
      }
      fromSql += me.getKey();
    }

    return fromSql;
  }
  public void processCreateVinc(
      final VisaoRelacionadaDTO visaoRelacionadaDto,
      final Collection colVinculos,
      final Map mapPai,
      final Map mapVinc,
      final UsuarioDTO usuarioDto,
      final HttpServletRequest request)
      throws Exception {
    final CamposObjetoNegocioDao camposObjetoNegocioDao = new CamposObjetoNegocioDao();
    if (colVinculos != null) {
      final Collection colCamposVinc = new ArrayList<>();
      final Map mapNew = new HashMap<>();
      for (final Iterator itVinculos = colVinculos.iterator(); itVinculos.hasNext(); ) {
        final VinculoVisaoDTO vinculoVisaoDTO = (VinculoVisaoDTO) itVinculos.next();
        if (vinculoVisaoDTO.getIdCamposObjetoNegocioPaiNN() != null) {
          CamposObjetoNegocioDTO camposObjetoNegocioDTOPai = new CamposObjetoNegocioDTO();
          camposObjetoNegocioDTOPai.setIdCamposObjetoNegocio(
              vinculoVisaoDTO.getIdCamposObjetoNegocioPaiNN());
          camposObjetoNegocioDTOPai =
              (CamposObjetoNegocioDTO) camposObjetoNegocioDao.restore(camposObjetoNegocioDTOPai);
          final String valuePai =
              (String) mapPai.get(camposObjetoNegocioDTOPai.getNomeDB().trim().toUpperCase());
          mapNew.put(camposObjetoNegocioDTOPai.getNomeDB().trim().toUpperCase(), valuePai);
          camposObjetoNegocioDTOPai.setSequence("N");
          colCamposVinc.add(camposObjetoNegocioDTOPai);
        }

        if (vinculoVisaoDTO.getIdCamposObjetoNegocioFilhoNN() != null) {
          CamposObjetoNegocioDTO camposObjetoNegocioDTOFilho = new CamposObjetoNegocioDTO();
          camposObjetoNegocioDTOFilho.setIdCamposObjetoNegocio(
              vinculoVisaoDTO.getIdCamposObjetoNegocioFilhoNN());
          camposObjetoNegocioDTOFilho =
              (CamposObjetoNegocioDTO) camposObjetoNegocioDao.restore(camposObjetoNegocioDTOFilho);

          final String valueFilho =
              (String) mapVinc.get(camposObjetoNegocioDTOFilho.getNomeDB().trim().toUpperCase());
          mapNew.put(camposObjetoNegocioDTOFilho.getNomeDB().trim().toUpperCase(), valueFilho);
          camposObjetoNegocioDTOFilho.setSequence("N");
          colCamposVinc.add(camposObjetoNegocioDTOFilho);
        }
      }
      if (colCamposVinc != null && colCamposVinc.size() > 0) {
        if (!this.isPKExists(colCamposVinc, mapNew)) {
          this.createFromMap(mapNew, colCamposVinc, usuarioDto, this.getDao(), request);
        }
      }
    }
  }
  private String generateFromWithRelatios(
      final Collection colPresentation, final Collection colFilter) throws Exception {
    final ObjetoNegocioDao objetoNegocioDao = new ObjetoNegocioDao();
    final HashMap map = new HashMap<>();

    final Collection colGeral = new ArrayList<>();
    if (colPresentation != null) {
      colGeral.addAll(colPresentation);
    }
    if (colFilter != null) {
      colGeral.addAll(colFilter);
    }

    if (colGeral != null) {
      for (final Iterator it = colGeral.iterator(); it.hasNext(); ) {
        final GrupoVisaoCamposNegocioDTO grupoVisaoCamposNegocioDTO =
            (GrupoVisaoCamposNegocioDTO) it.next();
        final CamposObjetoNegocioDTO camposObjetoNegocioDTO =
            grupoVisaoCamposNegocioDTO.getCamposObjetoNegocioDto();
        ObjetoNegocioDTO objetoNegocioDTO = new ObjetoNegocioDTO();

        objetoNegocioDTO.setIdObjetoNegocio(camposObjetoNegocioDTO.getIdObjetoNegocio());
        objetoNegocioDTO = (ObjetoNegocioDTO) objetoNegocioDao.restore(objetoNegocioDTO);

        if (objetoNegocioDTO != null) {
          if (!map.containsKey(objetoNegocioDTO.getNomeTabelaDB())) {
            map.put(objetoNegocioDTO.getNomeTabelaDB(), objetoNegocioDTO.getNomeTabelaDB());
          }
        }
      }
    }

    final Set set = map.entrySet();
    final Iterator i = set.iterator();

    String fromSql = "";
    while (i.hasNext()) {
      final Map.Entry me = (Map.Entry) i.next();
      if (!fromSql.equalsIgnoreCase("")) {
        fromSql += ",";
      }
      fromSql += me.getKey();
    }

    return fromSql;
  }
  /**
   * Seta informacoes importantes para a gravacao dados. As informacoes serao preenchidas nas
   * collections: colCamposPK, colCamposTodos
   *
   * @param colGrupos
   * @param colCamposPK
   * @param colCamposTodos
   * @throws Exception
   */
  @Override
  public void setInfoSave(
      final Integer idVisao, final Collection colCamposPK, final Collection colCamposTodos)
      throws Exception {
    final GrupoVisaoCamposNegocioDao grupoVisaoCamposNegocioDao = new GrupoVisaoCamposNegocioDao();
    final CamposObjetoNegocioDao camposObjetoNegocioDao = new CamposObjetoNegocioDao();
    final GrupoVisaoDao grupoVisaoDao = new GrupoVisaoDao();

    final Collection colGrupos = grupoVisaoDao.findByIdVisaoAtivos(idVisao);
    if (colGrupos != null) {
      for (final Iterator it = colGrupos.iterator(); it.hasNext(); ) {
        final GrupoVisaoDTO grupoVisaoDTO = (GrupoVisaoDTO) it.next();
        grupoVisaoDTO.setColCamposVisao(
            grupoVisaoCamposNegocioDao.findByIdGrupoVisaoAtivos(grupoVisaoDTO.getIdGrupoVisao()));

        if (grupoVisaoDTO.getColCamposVisao() != null) {
          for (final Iterator it2 = grupoVisaoDTO.getColCamposVisao().iterator(); it2.hasNext(); ) {
            final GrupoVisaoCamposNegocioDTO grupoVisaoCamposNegocioDTO =
                (GrupoVisaoCamposNegocioDTO) it2.next();

            CamposObjetoNegocioDTO camposObjetoNegocioDTO = new CamposObjetoNegocioDTO();
            camposObjetoNegocioDTO.setIdCamposObjetoNegocio(
                grupoVisaoCamposNegocioDTO.getIdCamposObjetoNegocio());
            camposObjetoNegocioDTO =
                (CamposObjetoNegocioDTO) camposObjetoNegocioDao.restore(camposObjetoNegocioDTO);

            if (camposObjetoNegocioDTO != null) {
              camposObjetoNegocioDTO.setFormula(grupoVisaoCamposNegocioDTO.getFormula());
              camposObjetoNegocioDTO.setTipoNegocio(grupoVisaoCamposNegocioDTO.getTipoNegocio());
              if (camposObjetoNegocioDTO.getPk().equalsIgnoreCase("S")) {
                colCamposPK.add(camposObjetoNegocioDTO);
              }
              colCamposTodos.add(camposObjetoNegocioDTO);
            }
          }
        }
      }
    }
  }
  public String executeFormula(
      String formula, final Map map, final CamposObjetoNegocioDTO camposObjetoNegocioDTO) {
    if (formula == null) {
      return null;
    }
    // SE FOR EXECUCAO DE CLASSE, CAI FORA! SERVE PARA CARREGAR COMBOS.
    if (camposObjetoNegocioDTO.getTipoNegocio() != null
        && camposObjetoNegocioDTO.getTipoNegocio().equalsIgnoreCase("CLASS")) {
      return null;
    }
    final org.mozilla.javascript.Context cx = org.mozilla.javascript.Context.enter();
    final org.mozilla.javascript.Scriptable scope = cx.initStandardObjects();

    final String sourceName = this.getClass().getName() + "_Formula";

    br.com.centralit.citcorpore.metainfo.util.HashMapUtil.map = map;

    final String retorno = "";
    formula = formula.replaceAll("TEXTSEARCH", "utilStrings.generateNomeBusca");
    formula = formula.replaceAll("GETFIELD", "hashMapUtil.getFieldInHash");
    formula = "retorno = " + formula;

    final StringBuilder compl = new StringBuilder();
    compl.append("var importNames = JavaImporter();\n");
    compl.append("importNames.importPackage(Packages.br.com.citframework.util);\n");
    compl.append(
        "importNames.importPackage(Packages.br.com.centralit.citcorpore.metainfo.util);\n");

    formula = compl.toString() + "\n" + formula;

    scope.put("retorno", scope, retorno);
    scope.put("utilStrings", scope, new UtilStrings());
    scope.put("hashMapUtil", scope, new HashMapUtil());

    final Object result = cx.evaluateString(scope, formula, sourceName, 1, null);

    return Context.toString(result);
  }
 /**
  * TRATAMENTO DE MATRIZ Este metodo trata do motor do sistema dinamico de gravacao de dados de
  * visoes (montadas dinamicamente)
  */
 @Override
 public void saveMatriz(
     final UsuarioDTO usuarioDto,
     final DinamicViewsDTO dinamicViewDto,
     final HttpServletRequest request)
     throws Exception {
   final String jsonMatriz = dinamicViewDto.getJsonMatriz();
   Map<String, Object> mapMatriz = null;
   try {
     mapMatriz = JSONUtil.convertJsonToMap(jsonMatriz, true);
   } catch (final Exception e) {
     LOGGER.error(e.getMessage(), e);
     LOGGER.debug("jsonMatriz: " + jsonMatriz);
     throw e;
   }
   final Collection colCamposPKPrincipal = new ArrayList<>();
   final Collection colCamposTodosPrincipal = new ArrayList<>();
   final List colMatrizTratada = (List) mapMatriz.get("MATRIZ");
   if (colMatrizTratada != null) {
     final Integer idVisao = dinamicViewDto.getDinamicViewsIdVisao();
     this.setInfoSave(idVisao, colCamposPKPrincipal, colCamposTodosPrincipal);
     CamposObjetoNegocioDTO camposObjetoNegocioDTO = null;
     if (colCamposPKPrincipal != null && colCamposPKPrincipal.size() > 0) {
       camposObjetoNegocioDTO = (CamposObjetoNegocioDTO) colCamposPKPrincipal.iterator().next();
     }
     if (camposObjetoNegocioDTO == null) {
       throw new Exception("Problema ao obter a chave da VISAO!");
     }
     for (final Iterator it = colMatrizTratada.iterator(); it.hasNext(); ) {
       final HashMap mapItem = (HashMap) it.next();
       mapItem.put(camposObjetoNegocioDTO.getNomeDB(), mapItem.get("FLD_0"));
       LOGGER.debug("Processando... " + mapItem);
       this.save(usuarioDto, dinamicViewDto, mapItem, request);
     }
   }
 }
  private String generateFilter(final Collection colFilter) throws Exception {
    final ObjetoNegocioDao objetoNegocioDao = new ObjetoNegocioDao();
    String sqlFilter = "";
    if (colFilter != null) {
      for (final Iterator it = colFilter.iterator(); it.hasNext(); ) {
        final GrupoVisaoCamposNegocioDTO grupoVisaoCamposNegocioDTO =
            (GrupoVisaoCamposNegocioDTO) it.next();
        final CamposObjetoNegocioDTO camposObjetoNegocioDTO =
            grupoVisaoCamposNegocioDTO.getCamposObjetoNegocioDto();
        ObjetoNegocioDTO objetoNegocioDTO = new ObjetoNegocioDTO();

        objetoNegocioDTO.setIdObjetoNegocio(camposObjetoNegocioDTO.getIdObjetoNegocio());
        objetoNegocioDTO = (ObjetoNegocioDTO) objetoNegocioDao.restore(objetoNegocioDTO);

        if (objetoNegocioDTO != null) {
          if (!sqlFilter.equalsIgnoreCase("")) {
            sqlFilter += " AND ";
          }
          String pref = "";
          String suf = "";
          String comp = "=";
          String value = "" + camposObjetoNegocioDTO.getValue();
          if (MetaUtil.isStringType(camposObjetoNegocioDTO.getTipoDB())) {
            pref = "'%";
            suf = "%'";
            comp = "LIKE";
          } else {
            if (MetaUtil.isNumericType(camposObjetoNegocioDTO.getTipoDB())) {
              value = this.getNumber(value);
            }
          }
          sqlFilter +=
              objetoNegocioDTO.getNomeTabelaDB()
                  + "."
                  + camposObjetoNegocioDTO.getNomeDB()
                  + " "
                  + comp
                  + " "
                  + pref
                  + value
                  + suf;
        }
      }
    }
    return sqlFilter;
  }
  @Override
  public Collection restoreVisao(final Integer idVisao, final Collection colFilter)
      throws Exception {
    final GrupoVisaoDao grupoVisaoDao = new GrupoVisaoDao();
    final GrupoVisaoCamposNegocioDao grupoVisaoCamposNegocioDao = new GrupoVisaoCamposNegocioDao();
    final CamposObjetoNegocioDao camposObjetoNegocioDao = new CamposObjetoNegocioDao();
    final Collection colGrupos = grupoVisaoDao.findByIdVisaoAtivos(idVisao);

    final LookupServiceEjb lookupService = new LookupServiceEjb();

    final Collection colCamposTodos = new ArrayList<>();
    if (colGrupos != null) {
      for (final Iterator it = colGrupos.iterator(); it.hasNext(); ) {
        final GrupoVisaoDTO grupoVisaoDTO = (GrupoVisaoDTO) it.next();
        grupoVisaoDTO.setColCamposVisao(
            grupoVisaoCamposNegocioDao.findByIdGrupoVisaoAtivos(grupoVisaoDTO.getIdGrupoVisao()));

        if (grupoVisaoDTO.getColCamposVisao() != null) {
          for (final Iterator it2 = grupoVisaoDTO.getColCamposVisao().iterator(); it2.hasNext(); ) {
            final GrupoVisaoCamposNegocioDTO grupoVisaoCamposNegocioDTO =
                (GrupoVisaoCamposNegocioDTO) it2.next();

            CamposObjetoNegocioDTO camposObjetoNegocioDTO = new CamposObjetoNegocioDTO();
            camposObjetoNegocioDTO.setIdCamposObjetoNegocio(
                grupoVisaoCamposNegocioDTO.getIdCamposObjetoNegocio());
            camposObjetoNegocioDTO =
                (CamposObjetoNegocioDTO) camposObjetoNegocioDao.restore(camposObjetoNegocioDTO);

            if (camposObjetoNegocioDTO != null) {
              grupoVisaoCamposNegocioDTO.setCamposObjetoNegocioDto(camposObjetoNegocioDTO);
              camposObjetoNegocioDTO.setFormula(grupoVisaoCamposNegocioDTO.getFormula());
              colCamposTodos.add(grupoVisaoCamposNegocioDTO);
            }
          }
        }
      }
    }

    final String sql = this.generateSQLRestore(colCamposTodos, colFilter);

    final Collection colRetorno = this.getDao().execSQL(sql, null);
    if (colRetorno != null) {
      for (final Iterator it = colRetorno.iterator(); it.hasNext(); ) {
        final Object[] objs = (Object[]) it.next();
        int i = 0;
        for (final Iterator it2 = colCamposTodos.iterator(); it2.hasNext(); ) {
          final GrupoVisaoCamposNegocioDTO grupoVisaoCamposNegocioDTO =
              (GrupoVisaoCamposNegocioDTO) it2.next();
          final CamposObjetoNegocioDTO camposObjetoNegocioDTO =
              grupoVisaoCamposNegocioDTO.getCamposObjetoNegocioDto();
          camposObjetoNegocioDTO.setValue(objs[i]);

          if (grupoVisaoCamposNegocioDTO.getTipoNegocio().equalsIgnoreCase(MetaUtil.RELATION)) {
            if (grupoVisaoCamposNegocioDTO.getTipoLigacao() == null) {
              grupoVisaoCamposNegocioDTO.setTipoLigacao(GrupoVisaoCamposNegocioDTO.RELATION_SIMPLE);
            }
            if (grupoVisaoCamposNegocioDTO
                .getTipoLigacao()
                .equalsIgnoreCase(GrupoVisaoCamposNegocioDTO.RELATION_SIMPLE)) {
              final LookupDTO lookupDto = new LookupDTO();
              lookupDto.setTermoPesquisa("");
              if (objs[i] != null) {
                lookupDto.setTermoPesquisa(objs[i].toString());
                lookupDto.setIdGrupoVisao(grupoVisaoCamposNegocioDTO.getIdGrupoVisao());
                lookupDto.setIdCamposObjetoNegocio(
                    camposObjetoNegocioDTO.getIdCamposObjetoNegocio());

                final ReturnLookupDTO returnLookupAux = lookupService.restoreSimple(lookupDto);
                camposObjetoNegocioDTO.setReturnLookupDTO(returnLookupAux);
              } else {
                camposObjetoNegocioDTO.setReturnLookupDTO(null);
              }
            }
          }

          i++;
        }
        break; // Como é restore, pega só o 1.o
      }
    }
    return colCamposTodos;
  }
  public void updateFromMap(
      final Map map,
      final Collection colCampos,
      final UsuarioDTO usuarioDto,
      final VisaoDao visaoDao,
      final HttpServletRequest request)
      throws Exception {
    final List lstParms = new ArrayList<>();
    final List lstWhere = new ArrayList<>();
    String strFields = "";
    String strWhere = "";
    final String strTable = this.generateFrom(colCampos);
    String sql = "UPDATE " + strTable + " ";
    for (final Iterator it = colCampos.iterator(); it.hasNext(); ) {
      final CamposObjetoNegocioDTO camposObjetoNegocioDTO = (CamposObjetoNegocioDTO) it.next();

      String strVal = "";
      if (camposObjetoNegocioDTO.getFormula() != null
          && !camposObjetoNegocioDTO.getFormula().trim().equalsIgnoreCase("")
          && !camposObjetoNegocioDTO
              .getTipoNegocio()
              .trim()
              .equalsIgnoreCase(MetaUtil.CLASS_AND_METHOD)) {
        strVal =
            this.executeFormula(camposObjetoNegocioDTO.getFormula(), map, camposObjetoNegocioDTO);
      } else {
        strVal = (String) map.get(camposObjetoNegocioDTO.getNomeDB().trim().toUpperCase());
      }
      if (!camposObjetoNegocioDTO.getPk().equalsIgnoreCase("S")) {
        if (strVal != null) {
          if (!strFields.equalsIgnoreCase("")) {
            strFields += ",";
          }
          strFields += "" + camposObjetoNegocioDTO.getNomeDB().trim() + " = ?";
          lstParms.add(
              MetaUtil.convertType(
                  camposObjetoNegocioDTO.getTipoDB().trim(),
                  strVal,
                  camposObjetoNegocioDTO.getPrecisionDB(),
                  request));
        }
      } else {
        if (strVal != null) {
          if (!strWhere.equalsIgnoreCase("")) {
            strWhere += " AND ";
          }
          strWhere += "" + camposObjetoNegocioDTO.getNomeDB() + " = ?";
          lstWhere.add(
              MetaUtil.convertType(
                  camposObjetoNegocioDTO.getTipoDB().trim(),
                  strVal,
                  camposObjetoNegocioDTO.getPrecisionDB(),
                  request));
        }
      }
    }
    sql += " SET " + strFields + " WHERE " + strWhere;

    lstParms.addAll(lstWhere);

    if (strFields != null && !strFields.trim().equalsIgnoreCase("")) {
      visaoDao.execUpdate(sql, lstParms.toArray());
      if (UtilStrings.nullToVazio(
              ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.USE_LOG, "false"))
          .equalsIgnoreCase("true")) {
        new Thread(new RegistraLogDinamicView(lstParms.toArray(), "U", sql, usuarioDto, strTable))
            .start();
      }
    }

    if (!map.containsKey("REMOVED")) {
      map.put("REMOVED", "false");
    }
    String removed = (String) map.get("REMOVED");
    if (removed == null) {
      removed = "false";
    }
    if (removed.equalsIgnoreCase("X")) { // A nova arquitetura coloca esta informacao.
      removed = "true";
    }
    String sqlUltAtualizAndLogicDelete = "";
    if (removed.equalsIgnoreCase("true")) {
      sqlUltAtualizAndLogicDelete = "UPDATE " + strTable + " SET DELETED = 'Y' WHERE " + strWhere;
      try {
        visaoDao.execUpdate(sqlUltAtualizAndLogicDelete, lstWhere.toArray());
        if (UtilStrings.nullToVazio(
                ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.USE_LOG, "false"))
            .equalsIgnoreCase("true")) {
          new Thread(
                  new RegistraLogDinamicView(
                      lstWhere.toArray(), "D", sqlUltAtualizAndLogicDelete, usuarioDto, strTable))
              .start();
        }
      } catch (final Exception e) {
        LOGGER.debug("SQL executado:" + sqlUltAtualizAndLogicDelete);
        throw new LogicException(
            "Não foi possí­vel realizar a exclusão do registro! Verifique se possui o Campo 'DELETED' do tipo CHAR(1) no Banco de dados!");
      }
    }
  }
  public Map createFromMap(
      final Map map,
      final Collection colCampos,
      final UsuarioDTO usuarioDto,
      final VisaoDao visaoDao,
      final HttpServletRequest request)
      throws Exception {
    final List lstParms = new ArrayList<>();
    String strValues = "";
    String strFields = "";

    if (colCampos == null) {
      LOGGER.debug("DinamicViewsServiceEjb - colCampos é null ");
    }

    final String strTable = this.generateFrom(colCampos);
    String sql = "INSERT INTO " + strTable.toLowerCase() + " ";
    if (colCampos != null) {
      for (final Iterator it = colCampos.iterator(); it.hasNext(); ) {
        final CamposObjetoNegocioDTO camposObjetoNegocioDTO = (CamposObjetoNegocioDTO) it.next();

        String strVal = "";
        if (camposObjetoNegocioDTO != null
            && camposObjetoNegocioDTO.getFormula() != null
            && !camposObjetoNegocioDTO.getFormula().trim().equalsIgnoreCase("")
            && !camposObjetoNegocioDTO
                .getTipoNegocio()
                .trim()
                .equalsIgnoreCase(MetaUtil.CLASS_AND_METHOD)) {
          strVal =
              this.executeFormula(camposObjetoNegocioDTO.getFormula(), map, camposObjetoNegocioDTO);
        } else {
          if (camposObjetoNegocioDTO != null) {
            strVal = (String) map.get(camposObjetoNegocioDTO.getNomeDB().trim());
          }
        }

        if (camposObjetoNegocioDTO != null
            && camposObjetoNegocioDTO.getSequence().equalsIgnoreCase("S")) {
          final int val =
              PersistenceEngine.getNextKey(
                  this.getDao().getAliasDB(),
                  strTable.toLowerCase(),
                  camposObjetoNegocioDTO.getNomeDB().trim().toLowerCase());

          if (!strValues.equalsIgnoreCase("")) {
            strValues += ",";
          }
          strValues += "?";

          if (!strFields.equalsIgnoreCase("")) {
            strFields += ",";
          }
          strFields += "" + camposObjetoNegocioDTO.getNomeDB().trim();

          map.put(camposObjetoNegocioDTO.getNomeDB().trim().toUpperCase(), "" + val);

          lstParms.add(val);
        } else {
          // Se o campo for obrigatório e o valor for null ou vazio, não pode continuar.
          if (camposObjetoNegocioDTO != null
              && camposObjetoNegocioDTO.getObrigatorio() != null
              && camposObjetoNegocioDTO.getObrigatorio().equalsIgnoreCase("S")) {
            if (strVal == null || strVal.trim().equals("")) {
              return map;
            }
          } else {
            /*
             * Desenvolvedor: euler.ramos e thiago.oliveira Data: 08/11/2013 Horário: 16h00min ID Citsmart: 123627 Motivo/Comentário: As telas
             * dinamic view não estavam
             * listando os registros que estavam com o campo deleted igual a null
             */
            if (camposObjetoNegocioDTO != null
                && camposObjetoNegocioDTO.getNome().equalsIgnoreCase("deleted")) {
              if (strVal == null || strVal.equals("")) {
                strVal = "n";
              }
            }
            // Se o campo não for obrigatório mas o valor for null, recebe vazio para garantir que
            // não de erro de sql (para campos tipo not null)
            if (strVal == null) {
              strVal = UtilStrings.nullToVazio(strVal);
            }
          }

          if (!strValues.equalsIgnoreCase("")) {
            strValues += ",";
          }
          strValues += "?";

          if (!strFields.equalsIgnoreCase("")) {
            strFields += ",";
          }
          if (camposObjetoNegocioDTO != null) {
            strFields += "" + camposObjetoNegocioDTO.getNomeDB().trim();
            lstParms.add(
                MetaUtil.convertType(
                    camposObjetoNegocioDTO.getTipoDB().trim(),
                    strVal,
                    camposObjetoNegocioDTO.getPrecisionDB(),
                    request));
          }
        }
      }
    }
    sql += "(" + strFields + ") VALUES (" + strValues + ")";
    visaoDao.execUpdate(sql, lstParms.toArray());

    if (UtilStrings.nullToVazio(
            ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.USE_LOG, "false"))
        .equalsIgnoreCase("true")) {
      new Thread(new RegistraLogDinamicView(lstParms.toArray(), "I", sql, usuarioDto, strTable))
          .start();
    }

    return map;
  }
  /**
   * Este metodo trata do motor do sistema dinamico de gravacao de dados de visoes (montadas
   * dinamicamente)
   */
  @Override
  public void save(
      final UsuarioDTO usuarioDto,
      final DinamicViewsDTO dinamicViewDto,
      final Map map,
      final HttpServletRequest request)
      throws Exception {
    final VisaoRelacionadaDao visaoRelacionadaDao = new VisaoRelacionadaDao();
    final GrupoVisaoDao grupoVisaoDao = new GrupoVisaoDao();
    final GrupoVisaoCamposNegocioDao grupoVisaoCamposNegocioDao = new GrupoVisaoCamposNegocioDao();
    final CamposObjetoNegocioDao camposObjetoNegocioDao = new CamposObjetoNegocioDao();
    final VinculoVisaoDao vinculoVisaoDao = new VinculoVisaoDao();
    final ScriptsVisaoDao scriptsVisaoDao = new ScriptsVisaoDao();
    final MatrizVisaoDao matrizVisaoDao = new MatrizVisaoDao();
    final VisaoDao visaoDao = this.getDao();
    final TransactionControler tc = this.getDao().getTransactionControler();

    visaoRelacionadaDao.setTransactionControler(tc);
    grupoVisaoDao.setTransactionControler(tc);
    grupoVisaoCamposNegocioDao.setTransactionControler(tc);
    camposObjetoNegocioDao.setTransactionControler(tc);
    vinculoVisaoDao.setTransactionControler(tc);
    scriptsVisaoDao.setTransactionControler(tc);
    matrizVisaoDao.setTransactionControler(tc);

    final Integer idVisao = dinamicViewDto.getDinamicViewsIdVisao();
    final Collection colScripts = scriptsVisaoDao.findByIdVisao(idVisao);
    final HashMap mapScritps = new HashMap<>();
    if (colScripts != null) {
      for (final Iterator it = colScripts.iterator(); it.hasNext(); ) {
        final ScriptsVisaoDTO scriptsVisaoDTO = (ScriptsVisaoDTO) it.next();
        mapScritps.put(
            scriptsVisaoDTO.getTypeExecute() + "#" + scriptsVisaoDTO.getScryptType().trim(),
            scriptsVisaoDTO.getScript());
      }
    }

    final Collection colCamposPKPrincipal = new ArrayList<>();
    final Collection colCamposTodosPrincipal = new ArrayList<>();
    Collection colCamposTodosVinc = null;
    CamposObjetoNegocioDTO camposObjetoNegocioChaveMatriz = new CamposObjetoNegocioDTO();

    this.setInfoSave(idVisao, colCamposPKPrincipal, colCamposTodosPrincipal);

    final Collection colVisoesRelacionadas = visaoRelacionadaDao.findByIdVisaoPaiAtivos(idVisao);

    try {
      tc.start();

      if (this.isPKExists(colCamposPKPrincipal, map)) {
        String strScript =
            (String)
                mapScritps.get(
                    ScriptsVisaoDTO.SCRIPT_EXECUTE_SERVER
                        + "#"
                        + ScriptsVisaoDTO.SCRIPT_ONUPDATE.getName());
        if (strScript != null && !strScript.trim().equalsIgnoreCase("")) {
          final ScriptRhinoJSExecute scriptExecute = new ScriptRhinoJSExecute();
          final RuntimeScript runtimeScript = new RuntimeScript();
          final Context cx = Context.enter();
          final Scriptable scope = cx.initStandardObjects();
          scope.put("mapFields", scope, map);
          final String action = "UPDATE";
          scope.put("ACTION", scope, action);
          scope.put("userLogged", scope, usuarioDto);
          scope.put("transactionControler", scope, tc);
          scope.put("dinamicViewDto", scope, dinamicViewDto);
          scope.put("RuntimeScript", scope, runtimeScript);
          scope.put("language", scope, WebUtil.getLanguage(request));
          scriptExecute.processScript(
              cx,
              scope,
              strScript,
              VisaoServiceEjb.class.getName() + "_" + ScriptsVisaoDTO.SCRIPT_ONUPDATE.getName());
        }
        if (!dinamicViewDto.isAbortFuncaoPrincipal()) {
          this.updateFromMap(map, colCamposTodosPrincipal, usuarioDto, visaoDao, request);
          strScript =
              (String)
                  mapScritps.get(
                      ScriptsVisaoDTO.SCRIPT_EXECUTE_SERVER
                          + "#"
                          + ScriptsVisaoDTO.SCRIPT_AFTERUPDATE.getName());
          if (strScript != null && !strScript.trim().equalsIgnoreCase("")) {
            final ScriptRhinoJSExecute scriptExecute = new ScriptRhinoJSExecute();
            final RuntimeScript runtimeScript = new RuntimeScript();
            final Context cx = Context.enter();
            final Scriptable scope = cx.initStandardObjects();
            scope.put("mapFields", scope, map);
            final String action = "UPDATE";
            scope.put("ACTION", scope, action);
            scope.put("userLogged", scope, usuarioDto);
            scope.put("transactionControler", scope, tc);
            scope.put("dinamicViewDto", scope, dinamicViewDto);
            scope.put("RuntimeScript", scope, runtimeScript);
            scope.put("language", scope, WebUtil.getLanguage(request));
            scriptExecute.processScript(
                cx,
                scope,
                strScript,
                VisaoServiceEjb.class.getName()
                    + "_"
                    + ScriptsVisaoDTO.SCRIPT_AFTERUPDATE.getName());
          }
        }
      } else {
        String strScript =
            (String)
                mapScritps.get(
                    ScriptsVisaoDTO.SCRIPT_EXECUTE_SERVER
                        + "#"
                        + ScriptsVisaoDTO.SCRIPT_ONCREATE.getName());
        if (strScript != null && !strScript.trim().equalsIgnoreCase("")) {
          final ScriptRhinoJSExecute scriptExecute = new ScriptRhinoJSExecute();
          final RuntimeScript runtimeScript = new RuntimeScript();
          final Context cx = Context.enter();
          final Scriptable scope = cx.initStandardObjects();
          scope.put("mapFields", scope, map);
          final String action = "CREATE";
          scope.put("ACTION", scope, action);
          scope.put("userLogged", scope, usuarioDto);
          scope.put("transactionControler", scope, tc);
          scope.put("dinamicViewDto", scope, dinamicViewDto);
          scope.put("RuntimeScript", scope, runtimeScript);
          scope.put("language", scope, WebUtil.getLanguage(request));
          scriptExecute.processScript(
              cx,
              scope,
              strScript,
              VisaoServiceEjb.class.getName() + "_" + ScriptsVisaoDTO.SCRIPT_ONCREATE.getName());
        }
        if (!dinamicViewDto.isAbortFuncaoPrincipal()) {
          this.createFromMap(map, colCamposTodosPrincipal, usuarioDto, visaoDao, request);
          strScript =
              (String)
                  mapScritps.get(
                      ScriptsVisaoDTO.SCRIPT_EXECUTE_SERVER
                          + "#"
                          + ScriptsVisaoDTO.SCRIPT_AFTERCREATE.getName());
          if (strScript != null && !strScript.trim().equalsIgnoreCase("")) {
            final ScriptRhinoJSExecute scriptExecute = new ScriptRhinoJSExecute();
            final RuntimeScript runtimeScript = new RuntimeScript();
            final Context cx = Context.enter();
            final Scriptable scope = cx.initStandardObjects();
            scope.put("mapFields", scope, map);
            final String action = "CREATE";
            scope.put("ACTION", scope, action);
            scope.put("userLogged", scope, usuarioDto);
            scope.put("transactionControler", scope, tc);
            scope.put("dinamicViewDto", scope, dinamicViewDto);
            scope.put("RuntimeScript", scope, runtimeScript);
            scope.put("language", scope, WebUtil.getLanguage(request));
            scriptExecute.processScript(
                cx,
                scope,
                strScript,
                VisaoServiceEjb.class.getName()
                    + "_"
                    + ScriptsVisaoDTO.SCRIPT_AFTERCREATE.getName());
          }
        }
      }
      if (colVisoesRelacionadas != null) {
        for (final Iterator it = colVisoesRelacionadas.iterator(); it.hasNext(); ) {
          final VisaoRelacionadaDTO visaoRelacionadaDto = (VisaoRelacionadaDTO) it.next();
          final Collection colVinculos =
              vinculoVisaoDao.findByIdVisaoRelacionada(visaoRelacionadaDto.getIdVisaoRelacionada());

          final Object objFromHash =
              map.get(
                  VisaoRelacionadaDTO.PREFIXO_SISTEMA_TABELA_VINCULADA
                      + visaoRelacionadaDto.getIdVisaoFilha());
          VisaoDTO visaoDtoAux = new VisaoDTO();
          visaoDtoAux.setIdVisao(visaoRelacionadaDto.getIdVisaoFilha());
          visaoDtoAux = (VisaoDTO) visaoDao.restore(visaoDtoAux);
          MatrizVisaoDTO matrizVisaoDTO = new MatrizVisaoDTO();
          boolean ehMatriz = false;
          if (visaoDtoAux != null) {
            if (visaoDtoAux.getTipoVisao().equalsIgnoreCase(VisaoDTO.MATRIZ)) {
              ehMatriz = true;
              matrizVisaoDTO.setIdVisao(visaoDtoAux.getIdVisao());
              final Collection colMatriz = matrizVisaoDao.findByIdVisao(visaoDtoAux.getIdVisao());
              if (colMatriz != null && colMatriz.size() > 0) {
                matrizVisaoDTO = (MatrizVisaoDTO) colMatriz.iterator().next();
                camposObjetoNegocioChaveMatriz.setIdCamposObjetoNegocio(
                    matrizVisaoDTO.getIdCamposObjetoNegocio1());
                camposObjetoNegocioChaveMatriz.setIdObjetoNegocio(
                    matrizVisaoDTO.getIdObjetoNegocio());
                camposObjetoNegocioChaveMatriz =
                    (CamposObjetoNegocioDTO)
                        camposObjetoNegocioDao.restore(camposObjetoNegocioChaveMatriz);
              }
            }
          }

          if (HashMap.class.isInstance(objFromHash)) {
            final HashMap mapVinc = (HashMap) objFromHash;
            if (mapVinc != null) { // Se existir dados recebidos.
              final Collection colCamposPKVinc = new ArrayList<>();
              colCamposTodosVinc = new ArrayList<>();
              this.setInfoSave(
                  visaoRelacionadaDto.getIdVisaoFilha(), colCamposPKVinc, colCamposTodosVinc);
              // Grava os dados de informacoes vinculadas.
              if (this.isPKExists(colCamposPKVinc, mapVinc)) {
                this.updateFromMap(mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
              } else {
                this.createFromMap(mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
              }
            }
          } else if (Collection.class.isInstance(objFromHash)) {
            final Collection colVinc = (Collection) objFromHash;
            if (colVinc != null) {
              for (final Iterator it2 = colVinc.iterator(); it2.hasNext(); ) {
                Map mapVinc = (Map) it2.next();
                if (mapVinc != null) { // Se existir dados recebidos.
                  final Collection colCamposPKVinc = new ArrayList<>();
                  colCamposTodosVinc = new ArrayList<>();
                  this.setInfoSave(
                      visaoRelacionadaDto.getIdVisaoFilha(),
                      colCamposPKVinc,
                      colCamposTodosVinc); // *****
                  String tipoVinc = "";
                  if (colVinculos != null && colVinculos.size() > 0) {
                    final VinculoVisaoDTO vinculoVisaoDTO =
                        (VinculoVisaoDTO) ((List) colVinculos).get(0);
                    tipoVinc = vinculoVisaoDTO.getTipoVinculo();
                  }
                  if (ehMatriz) {
                    if (camposObjetoNegocioChaveMatriz != null) {
                      mapVinc.put(camposObjetoNegocioChaveMatriz.getNomeDB(), mapVinc.get("FLD_0"));
                    }
                    CamposObjetoNegocioDTO camposObjetoNegocioDTO = null;
                    if (colCamposPKVinc != null && colCamposPKVinc.size() > 0) {
                      for (final Iterator itVinc = colCamposPKVinc.iterator(); itVinc.hasNext(); ) {
                        camposObjetoNegocioDTO = (CamposObjetoNegocioDTO) itVinc.next();
                        if (!camposObjetoNegocioDTO
                            .getNomeDB()
                            .trim()
                            .equalsIgnoreCase(camposObjetoNegocioChaveMatriz.getNomeDB().trim())) {
                          mapVinc.put(
                              camposObjetoNegocioDTO.getNomeDB(),
                              map.get(camposObjetoNegocioDTO.getNomeDB()));
                        }
                      }
                    }
                    if (tipoVinc == null || tipoVinc.equalsIgnoreCase("")) {
                      tipoVinc = VinculoVisaoDTO.VINCULO_1_TO_N;
                    }
                  }
                  if (tipoVinc.equalsIgnoreCase(VinculoVisaoDTO.VINCULO_N_TO_N)) {
                    // Grava os dados de informacoes vinculadas.
                    if (this.isPKExists(colCamposPKVinc, mapVinc)) {
                      this.updateFromMap(
                          mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
                    } else {
                      this.createFromMap(
                          mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
                    }
                    this.processCreateVinc(
                        visaoRelacionadaDto, colVinculos, map, mapVinc, usuarioDto, request);
                  }
                  if (tipoVinc.equalsIgnoreCase(VinculoVisaoDTO.VINCULO_1_TO_N)) {
                    mapVinc = this.createUniqueMap(map, mapVinc); // ******
                    // Grava os dados de informacoes vinculadas.
                    if (this.isPKExists(colCamposPKVinc, mapVinc)) {
                      this.updateFromMap(
                          mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
                    } else {
                      this.createFromMap(
                          mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
                    }
                  }
                }
              }
            }
          }
        }
      }

      if (dinamicViewDto.getIdFluxo() != null || dinamicViewDto.getIdTarefa() != null) {
        new ExecucaoSolicitacaoServiceEjb()
            .executa(
                usuarioDto,
                tc,
                dinamicViewDto.getIdFluxo(),
                dinamicViewDto.getIdTarefa(),
                dinamicViewDto.getAcaoFluxo(),
                map,
                colCamposTodosPrincipal,
                colCamposTodosVinc);
      }

      tc.commit();
      tc.close();
    } catch (final Exception e) {
      this.rollbackTransaction(tc, e);
    }
  }
  @Override
  public boolean isPKExists(final Collection colCamposPK, final Map hashValores) throws Exception {
    final ObjetoNegocioDao objetoNegocioDao = new ObjetoNegocioDao();
    String sql = "SELECT ";
    String sqlFields = "";
    String sqlFilter = "";
    int i = 1;
    if (colCamposPK == null || colCamposPK.size() == 0) {
      return false;
    }
    for (final Iterator it = colCamposPK.iterator(); it.hasNext(); ) {
      final CamposObjetoNegocioDTO camposObjetoNegocioDTO = (CamposObjetoNegocioDTO) it.next();
      ObjetoNegocioDTO objetoNegocioDTO = new ObjetoNegocioDTO();

      objetoNegocioDTO.setIdObjetoNegocio(camposObjetoNegocioDTO.getIdObjetoNegocio());
      objetoNegocioDTO = (ObjetoNegocioDTO) objetoNegocioDao.restore(objetoNegocioDTO);

      if (objetoNegocioDTO != null) {
        if (!sqlFields.equalsIgnoreCase("")) {
          sqlFields += ", ";
        }
        sqlFields +=
            objetoNegocioDTO.getNomeTabelaDB()
                + "."
                + camposObjetoNegocioDTO.getNomeDB()
                + " Val_"
                + i;
      }
      if (!sqlFilter.equalsIgnoreCase("")) {
        sqlFilter += " AND ";
      }
      String pref = "";
      String suf = "";
      final String comp = "=";
      if (MetaUtil.isStringType(camposObjetoNegocioDTO.getTipoDB().trim())) {
        pref = "'";
        suf = "'";
      }
      String strVal = (String) hashValores.get(camposObjetoNegocioDTO.getNomeDB().toUpperCase());
      if (strVal != null) {
        if (strVal.trim().equalsIgnoreCase("")) {
          // Se nao existir valor para a PK, eh que nao existe!
          return false;
        }
        if (MetaUtil.isNumericType(camposObjetoNegocioDTO.getTipoDB().trim())) {
          final int x = strVal.indexOf("["); // Vai ate este ponto, pois o codigo fica entre [x]
          if (x > -1) {
            strVal = strVal.substring(x);
          }
          strVal = UtilStrings.apenasNumeros(strVal);
        }
        strVal = strVal.replaceAll(",00", "");
        strVal = strVal.replaceAll("\\,", ".");
        sqlFilter +=
            objetoNegocioDTO.getNomeTabelaDB()
                + "."
                + camposObjetoNegocioDTO.getNomeDB()
                + " "
                + comp
                + " "
                + pref
                + strVal
                + suf;
      } else {
        // Se nao existir valor para a PK, eh que nao existe!
        return false;
      }
      i++;
    }

    sql += sqlFields + " FROM " + this.generateFrom(colCamposPK) + " WHERE " + sqlFilter;

    final Collection colRet = this.getDao().execSQL(sql, null);
    if (colRet == null) {
      return false;
    }
    if (colRet.size() > 0) {
      return true;
    }
    return false;
  }