sim sim eu tenho Action sim, ta OK , esses tao sendo usado para um monte de coisa, soh a JSP eh nova…
/*
* @(#)EstacaoDAO.java 1.0 2006/2/13
*
* Este código-fonte é propriedade da GENTEC Management, Training and IT tools.
* Não é permitida a distribuição, cópia, modificação ou licenciamento
* sem permissão desta empresa.
*/
package br.inf.gentec.mtva.inventario;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Properties;
import java.text.SimpleDateFormat;
import br.inf.gentec.mtva.core.DAO;
import br.inf.gentec.mtva.core.DAOException;
/**
* Camada de negócio responsavel por obeter uma estação
* específica ou listar todas as estações cadastradas.
*
* @author Hugo Weber
* @version 1.0 13/2/2006
*/
public class EstacaoDAO{
//Busca conexões com o banco de dados no pool de conexões
private DAO dao;
public static final int ID_INVALIDO = 0;
public static final String NOME_INVALIDO = "";
public static final short ESTACAO_ATIVA = 1;
public static final short ESTACAO_INATIVA = 2;
public static final short ESTACAO_ATIVA_E_INATIVA = 3;
public static final short TIPO_COMPARTILHAMENTO_DISCO = 0;
public static final short TIPO_COMPARTILHAMENTO_IMPRESSORA = 1;
public static final short TIPO_COMPARTILHAMENTO_INVALIDO = -1;
/**
* Cria um objeto EstacaoDAO
*/
public EstacaoDAO(){
dao = DAO.getInstance();
}
/**
* Retorna a lista das estações por ordem inversa de data de inventario
* e ordem direta de nome. <b>Somente sao listadas as estacoes que tem
* sistema operacional</b>, se o sistema operacional nao conseguir ser
* cadastrado, a estacao nao vai aparecer.
*
* @param tipo {@link EstacaoDAO#ESTACAO_ATIVA}, {@link EstacaoDAO#ESTACAO_INATIVA}, {@link EstacaoDAO#ESTACAO_ATIVA_E_INATIVA}
* @param id Filtro, 0 (zero) para listar todas ou o ID da estacao que deseja
*
* @return - Lista de todas as estações cadastradas.
* @throws DAOException - Caso ocorra algum erro ao buscar conexão
* ou pesquisar a lista de estações.
*/
public Collection<EstacaoDTO> getEstacoes(short tipo, int id) throws DAOException{
Connection conexao = dao.getConnection();
Collection<EstacaoDTO> listagem = null;
try {
/*
* SQL para listar as estações por ordem inversa de
* data de inventario e ordem direta de nome.
*
* OBS: Somente sao listadas as estacoes que tem
* sistema operacional, se o sistema operacional nao
* conseguir ser cadastrado, a estacao nao vai aparecer.
*/
StringBuilder sql = new StringBuilder();
PreparedStatement ps = null;
ResultSet resultado = null;
sql.append("SELECT est.id_estacao, ");
sql.append("est.nome AS estacao, ");
sql.append("est.agente_versao, ");
sql.append("est.dt_ultimo_inv, ");
sql.append("est.usuario, ");
sql.append("est.net_shares, ");
sql.append("est.ativa, ");
sql.append("sw.nome AS so, ");
sql.append("sw.versao, ");
sql.append("aux.dt_instalacao, ");
sql.append("aux.patch ");
sql.append("FROM estacao est INNER JOIN aux_estacao_sw aux ON est.id_estacao=aux.id_estacao ");
sql.append("INNER JOIN invsw sw ON sw.id_invsw=aux.id_invsw ");
sql.append("WHERE sw.id_sw_grupo=2 ");
switch(tipo){
case ESTACAO_INATIVA:
sql.append("AND est.ativa='N' ");
break;
case ESTACAO_ATIVA:
sql.append("AND est.ativa='S' ");
break;
}
if(id > 0){
sql.append("AND est.id_estacao = ");
sql.append(id);
}
sql.append(" ORDER BY est.dt_ultimo_inv DESC, est.nome ASC");
//Busca as estações na base de dados.
ps = conexao.prepareStatement(sql.toString());
resultado = ps.executeQuery();
/*
* A regra abaixo foi alterada. Cada estacao possui
* apenas 1 sistema operacional. Esse processo é mais
* simples de implementar, mas o código ainda continua
* o mesmo porque no futuro será implementado conforme
* descrito abaixo.
*
* Como cada estação pode conter mais de 1 sistema
* operacional instalado, a SQL acima pode retornar
* nomes de estações repetidos.
*
* A cada registro que o laço abaixo passa, é verificado
* se o nome da estação é repetido, se for, é adicionado
* somente os dados do sistema operacional a uma coleção,
* se o nome da estação for diferente, a coleção com os
* sistemas operacionais da estação é adicionada, junto
* com os dados da estação, a listagem de estações.
*
*/
//Listagem de estações que será retornada.
listagem = new ArrayList<EstacaoDTO>();
/*
* Os IDs abaixo são inicializados com valores
* diferentes para forçar a primeira entrada
* e listar a primeira estação.
*/
//Ajustado quando a mudança no nome da estação
int idEstacaoAnterior = ID_INVALIDO;
//Ajustado a cada registro que o laço busca
int idEstacaoAtual = -1;
//Ultima estação a ser adicionada, fora do laço while
EstacaoDTO e = null;
while(resultado.next()){
//busca o ID da estação atual
idEstacaoAtual = resultado.getInt("id_estacao");
/*
* Se a estação atual for nova, ou seja, diferente
* da estação anterior, então sera criado um novo
* EstacaoItemDTO com os dados da estação anterior,
* e nele adicionado seus sistemas operacionais.
*
* A estação será adicionada na lista de estações.
*
* Entao uma nova listagem de sistemas operacionais
* sera criada para a proxima estação.
*/
if(idEstacaoAnterior != idEstacaoAtual){
/*
* Se NÃO é a primeira vez que entra no loop
* então adicione a estação anterior
*/
if(idEstacaoAnterior != ID_INVALIDO){
listagem.add(e);
}
/*
* Preenche os dados da nova estação e gera
* uma nova lista de sistemas operacionais
*/
e = new EstacaoDTO();
e.setIdEstacao(resultado.getInt("id_estacao"));
e.setNome(resultado.getString("estacao"));
e.setVersaoAgente(resultado.getString("agente_versao"));
e.setDtUltimoInv(resultado.getDate("dt_ultimo_inv"));
e.setUsuario(resultado.getString("usuario"));
if(resultado.getString("ativa").charAt(0) == 'S'){
e.setAtiva(true);
}else{
e.setAtiva(false);
}
e.setSistemasOperacionais(new ArrayList<InvSwDTO>());
montarCompartilhamentos(e, resultado.getString("net_shares"));
idEstacaoAnterior = idEstacaoAtual;
}
/*
* adiciona o sistema operacional a estação atual.
*/
InvSwDTO so = new InvSwDTO();
so.setNome(resultado.getString("so"));
so.setVersao(resultado.getString("versao"));
so.setPatch(resultado.getString("patch"));
so.setDataInstalacao(resultado.getDate("dt_instalacao"));
e.getSistemasOperacionais().add(so);
}//fim do while
if (e != null){
listagem.add(e);
}
resultado.close();
}catch(SQLException e){
e.printStackTrace(System.err);
throw new DAOException(e.getMessage());
}finally{
/*
* Libera a conexão de volta para o Pool.
*/
try {
conexao.close();
}catch(SQLException e1){
throw new DAOException(e1.getMessage());
}
}
return listagem;
}
public Collection<EstacaoDTO> getEstacoes(short tipo) throws DAOException{
return getEstacoes(tipo, 0);
}
private void montarCompartilhamentos(EstacaoDTO e, String ns){
if(ns != null && !ns.trim().equals("")){
String[] shares = ns.split(";");
ArrayList<CompartilhamentoDTO> l = new ArrayList<CompartilhamentoDTO>();
for(int k = 0; k < shares.length; k+=4){
try{
CompartilhamentoDTO c = new CompartilhamentoDTO();
c.setTipo(Short.parseShort(shares[k]));
c.setNome(shares[k+1]);
c.setCaminho(shares[k+2]);
c.setComentario(shares[k+3]);
l.add(c);
}catch(Exception x){
//Isso deveria estar num log, fazer isso urgente Hugo 1-2-2007
System.out.print("erro ao ler o campo de compartilhamento [" + x.getMessage() +"]");
}
}
e.setCompartilhamentos(l);
}
}
EstacaoDTO getEstacao(String serial) throws DAOException{
Connection conexao = dao.getConnection();
EstacaoDTO e = null;
try {
StringBuilder sql = new StringBuilder();
PreparedStatement ps = null;
ResultSet resultado = null;
sql.append("SELECT id_estacao, ");
sql.append("nome AS estacao, ");
sql.append("agente_versao, ");
sql.append("dt_ultimo_inv, ");
sql.append("usuario, ");
sql.append("net_shares, ");
sql.append("ativa ");
sql.append("FROM estacao WHERE agente_serial = ?");
ps = conexao.prepareStatement(sql.toString());
ps.setString(1, serial);
resultado = ps.executeQuery();
if(resultado.next()){
e = new EstacaoDTO();
e.setIdEstacao(resultado.getInt("id_estacao"));
e.setNome(resultado.getString("estacao"));
e.setVersaoAgente(resultado.getString("agente_versao"));
e.setDtUltimoInv(resultado.getDate("dt_ultimo_inv"));
e.setUsuario(resultado.getString("usuario"));
if(resultado.getString("ativa").charAt(0) == 'S'){
e.setAtiva(true);
}else{
e.setAtiva(false);
}
montarCompartilhamentos(e, resultado.getString("net_shares"));
}
resultado.close();
}catch(SQLException ex){
ex.printStackTrace(System.err);
throw new DAOException(ex.getMessage());
}finally{
/*
* Libera a conexão de volta para o Pool.
*/
try {
conexao.close();
}catch(SQLException e1){
throw new DAOException(e1.getMessage());
}
}
return e;
}
/**
* Extrai, do inventário enviado pelo agente MTVA, os
* dados da estação e do sistema operacional. Aqui não
* são extraídos todos os sistemas operacionais, somente
* um, pois o agente MTVA não vai estar rodando ao mesmo
* tempo em 2 sistemas operacionais na mesma estação.
*
* @param p Inventario enviado pelo agente MTVA
* @return EstacaoItemDTO contendo os dados da estaçãoo e o sistema operacinal instalado
*/
EstacaoDTO extrairEstacao(Properties p){
EstacaoDTO estacao = new EstacaoDTO();
InvSwDTO so = new InvSwDTO();
ArrayList<InvSwDTO> sos = new ArrayList<InvSwDTO>();
Collection<CompartilhamentoDTO> comps = new ArrayList<CompartilhamentoDTO>();
int k = 0;//contador
SimpleDateFormat dt = new SimpleDateFormat("dd/MM/yyyy");
//dados da estação
estacao.setNome(p.getProperty("estacao.nome"));
estacao.setVersaoAgente(p.getProperty("estacao.agente_versao"));
estacao.setSerialAgente(p.getProperty("agente.serial"));
estacao.setUsuario(p.getProperty("invlogico.usuario.login"));
//dados do sistema operacional
so.setPlataforma(p.getProperty("estacao.sistema_operacional.plataforma"));
so.setNome(p.getProperty("estacao.sistema_operacional.nome"));
so.setVersao(p.getProperty("estacao.sistema_operacional.versao"));
so.setPatch(p.getProperty("estacao.sistema_operacional.patch"));
so.setFabricante(p.getProperty("estacao.sistema_operacional.fabricante"));
so.setSerial(p.getProperty("estacao.sistema_operacional.serial"));
//Obtem a data se o SO for portugues do brasil
try {
so.setDataInstalacao(dt.parse(p.getProperty("estacao.sistema_operacional.dt_instalacao")));
}catch(Exception e){
so.setDataInstalacao(null);
}
sos.add(so);
estacao.setSistemasOperacionais(sos);
/*
* Dados dos compartilhamentos.
*/
k = 1;
while(p.getProperty("invlogico.compartilhamento." + k + ".tipo") != null){
CompartilhamentoDTO comp = new CompartilhamentoDTO();
comp.setTipo(Short.parseShort(p.getProperty("invlogico.compartilhamento." + k + ".tipo")));
comp.setNome(p.getProperty("invlogico.compartilhamento." + k + ".nome"));
comp.setCaminho(p.getProperty("invlogico.compartilhamento." + k + ".caminho"));
comp.setComentario(p.getProperty("invlogico.compartilhamento." + k + ".comentario"));
comps.add(comp);
k++;
}
estacao.setCompartilhamentos(comps);
return estacao;
}
/**
* Cadastra uma nova estação na base de dados.
*
* @param estacao - Dados da estação que se será cadastrada.
* @return - ID da estação cadastrado.
* @throws DAOException - Caso ocorra algum erro ao buscar conexão
* ou cadastrar a nova estação.
*/
Integer inserir(EstacaoDTO estacao)throws DAOException{
Connection conexao = dao.getConnection();
try{
Date dtAgora = new Date(System.currentTimeMillis());
StringBuilder sql = new StringBuilder();
StringBuilder shares = new StringBuilder();
/*
* Os compartilhamentos sao gravados em um campo TXT
* separados por ; porque uma tabela de compartilhamentos
* que tem registros deletados e inseridos toda hora
* esgota rapidamente o campo ID.
*/
for(CompartilhamentoDTO c : estacao.getCompartilhamentos()){
shares.append(c.getTipo());
shares.append(';');
shares.append(c.getNome());
shares.append(';');
shares.append(c.getCaminho());
shares.append(';');
shares.append(c.getComentario());
shares.append(';');
}
sql.append("INSERT INTO estacao (");
sql.append("nome, ");
sql.append("agente_versao, ");
sql.append("agente_serial, ");
sql.append("dt_primeiro_inv, ");
sql.append("dt_ultimo_inv, ");
sql.append("usuario, ");
sql.append("net_shares) ");
sql.append("VALUES (?, ?, ?, ?, ?, ?, ?)");
PreparedStatement ps = conexao.prepareStatement(sql.toString());
ps.setString(1, estacao.getNome());
ps.setString(2, estacao.getVersaoAgente());
ps.setString(3, estacao.getSerialAgente());
ps.setDate(4, dtAgora);
ps.setDate(5, dtAgora);
ps.setString(6, estacao.getUsuario());
ps.setString(7, shares.toString());
ps.execute();
ps.close();
// Recupera o ID da estacao inserida
ps = conexao.prepareStatement("SELECT MAX(id_estacao) FROM estacao");
ResultSet rs = ps.executeQuery();
if(rs.next()){
estacao.setIdEstacao(rs.getInt(1));
rs.close(); //Fecha o resultSet para liberar recursos alocados
}else{
throw new DAOException("Erro ao buscar o ID da estacao inserida");
}
sql.delete(0,sql.length());
//Já cadastra o patrimonio da estacao, para uma empresa ainda inexistente (1)
sql.append("INSERT INTO patrimonio (");
sql.append("id_estacao, id_empresa, ");
sql.append("id_localidade, id_departamento, id_grupo) ");
sql.append("VALUES (?, 1, 1, 1, 1)");
ps = conexao.prepareStatement(sql.toString());
ps.setInt(1, estacao.getIdEstacao());
ps.execute();
ps.close();
conexao.commit();//A conexão tem autocommit false
}catch(SQLException e){
try{
//Cancela a transação
conexao.rollback(); //A conexão tem autocommit false
throw new DAOException("Erro ao inserir a estacao: [" + e.getMessage() + "]");
}catch(SQLException e1){
throw new DAOException("Erro ao cancelar a transacao: [" + e1.getMessage() + "]");
}
}finally{
/*
* Libera a conexão de volta para o Pool.
*/
try {
conexao.close();
}catch(SQLException e1){
e1.printStackTrace(System.err);
throw new DAOException(e1.getMessage());
}
}
return estacao.getIdEstacao();
}
/**
* Atualiza uma estação na base de dados.
*
* @param estacao - Dados da estação que se será atualizada.
* @throws DAOException - Caso ocorra algum erro ao buscar conexão
* ou atualizar a estação.
*/
void atualizar(EstacaoDTO estacao) throws DAOException {
Connection conexao = dao.getConnection();
boolean fixo = isUsuarioFixo(estacao.getIdEstacao());
try{
//Gravando dados da estacao
StringBuilder sql = new StringBuilder();
StringBuilder shares = new StringBuilder();
/*
* Os compartilhamentos sao gravados em um campo TXT
* separados por ; porque uma tabela de compartilhamentos
* que tem registros deletados e inseridos toda hora
* esgota rapidamente o campo ID.
*/
for(CompartilhamentoDTO c : estacao.getCompartilhamentos()){
shares.append(c.getTipo());
shares.append(';');
shares.append(c.getNome());
shares.append(';');
shares.append(c.getCaminho());
shares.append(';');
shares.append(c.getComentario());
shares.append(';');
}
sql.append("UPDATE estacao SET ");
sql.append("nome = ?, ");
sql.append("agente_versao = ?, ");
sql.append("agente_serial = ?, ");
sql.append("dt_ultimo_inv = ?, ");
if(!fixo){
sql.append("net_shares = ?, ");//olha a virgula
sql.append("usuario = ? ");
}else{
sql.append("net_shares = ? ");//esse não tem virgula apos o sinal de interrogacao
}
sql.append("WHERE id_estacao = ?");
PreparedStatement ps = conexao.prepareStatement(sql.toString());
ps.setString(1, estacao.getNome());
ps.setString(2, estacao.getVersaoAgente());
ps.setString(3, estacao.getSerialAgente());
ps.setDate(4, new Date(System.currentTimeMillis()));
ps.setString(5, shares.toString());
if(!fixo){
ps.setString(6, estacao.getUsuario());
ps.setInt(7, estacao.getIdEstacao());
}else{
ps.setInt(6, estacao.getIdEstacao());
}
ps.execute();
ps.close();
conexao.commit();//A conexão tem autocommit false
}catch(SQLException e){
throw new DAOException("Erro ao atualizar a estacao: [" + e.getMessage() + "]");
}finally{
/*
* Libera a conexão de volta para o Pool.
*/
try {
conexao.close();
}catch(SQLException e1){
e1.printStackTrace(System.err);
throw new DAOException(e1.getMessage());
}
}
}
/**
* Marca a estação como ativa.
*
* @author Angelo J. R. Pereira
*
* @param nome - nome da estacao
* @throws DAOException - Caso ocorra algum erro ao buscar conexão
* ou modificar a estacao.
*/
public void setAtiva(int id, boolean ativa) throws DAOException {
Connection conexao = dao.getConnection();
try{
StringBuilder sql = new StringBuilder();
sql.append("UPDATE estacao SET ativa = ");
if(ativa){
sql.append("'S'");
}else{
sql.append("'N'");
}
sql.append("WHERE id_estacao = ?");
PreparedStatement ps = conexao.prepareStatement(sql.toString());
ps.setInt(1, id);
ps.execute();
ps.close();
conexao.commit();//A conexão tem autocommit false
}catch(SQLException e){
throw new DAOException("setAtiva retornou: [" + e.getMessage() + "]");
}finally{
/*
* Libera a conexão de volta para o Pool.
*/
try {
conexao.close();
}catch(SQLException e1){
throw new DAOException(e1.getMessage());
}
}
}
/**
* Retorna se a estacao esta ativa.
*
* @author Angelo J. R. Pereira
* @param estacao - EstacaoMTVA que deseja descobrir se esta ativa
* @return boolean informado se a estação é ativa ou não.
* @throws DAOException
*/
public boolean isAtiva(int id) throws DAOException{
Connection conexao = dao.getConnection();
boolean ativa = false;
PreparedStatement ps = null;
try{
ps = conexao.prepareStatement("SELECT id_estacao FROM estacao WHERE id_estacao = ? AND ativa='S'");
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if(rs.next()){
ativa = true;
}
rs.close();
}catch(Exception e){
throw new DAOException("isAtiva retornou: [" + e.getMessage() + "]");
}finally{
/*
* Libera a conexão de volta para o Pool.
*/
try {
conexao.close();
}catch(SQLException e1){
throw new DAOException(e1.getMessage());
}
}
return ativa;
}
public void setUsuarioFixo(int id, boolean fixo) throws DAOException {
Connection conexao = dao.getConnection();
try{
StringBuilder sql = new StringBuilder();
sql.append("UPDATE estacao SET usuario_fixo = ");
if(fixo){
sql.append("'S'");
}else{
sql.append("'N'");
}
sql.append("WHERE id_estacao = ?");
PreparedStatement ps = conexao.prepareStatement(sql.toString());
ps.setInt(1, id);
ps.execute();
ps.close();
conexao.commit();//A conexão tem autocommit false
}catch(SQLException e){
throw new DAOException("setUsuarioFixo retornou: [" + e.getMessage() + "]");
}finally{
/*
* Libera a conexão de volta para o Pool.
*/
try {
conexao.close();
}catch(SQLException e1){
throw new DAOException(e1.getMessage());
}
}
}
public boolean isUsuarioFixo(int id) throws DAOException{
Connection conexao = dao.getConnection();
boolean r = false;
PreparedStatement ps = null;
try{
ps = conexao.prepareStatement("SELECT id_estacao FROM estacao WHERE id_estacao = ? AND usuario_fixo='S'");
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if(rs.next()){
r = true;
}
rs.close();
}catch(Exception e){
throw new DAOException("isUsuarioFixo retornou: [" + e.getMessage() + "]");
}finally{
/*
* Libera a conexão de volta para o Pool.
*/
try {
conexao.close();
}catch(SQLException e1){
throw new DAOException(e1.getMessage());
}
}
return r;
}
}