diff --git a/pom.xml b/pom.xml index 05b24bb..94071da 100644 --- a/pom.xml +++ b/pom.xml @@ -14,5 +14,10 @@ slf4j-simple 1.7.21 + + org.postgresql + postgresql + 42.2.16 + diff --git a/src/main/java/dao/ProdutoDAO.java b/src/main/java/dao/ProdutoDAO.java index e1a237f..cc99821 100644 --- a/src/main/java/dao/ProdutoDAO.java +++ b/src/main/java/dao/ProdutoDAO.java @@ -1,123 +1,129 @@ package dao; import model.Produto; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.ArrayList; -import java.util.List; +import java.sql.*; public class ProdutoDAO { - private List produtos; - private int maxId = 0; + private Connection conexao; - private File file; - private FileOutputStream fos; - private ObjectOutputStream outputFile; + public ProdutoDAO() throws Exception { + String driverName = "org.postgresql.Driver"; - public int getMaxId() { - return maxId; + String server = "localhost"; + int porta = 5432; + + String username = "postgres"; + String password = "1234"; + + String mydatabase = "postgres"; + + String url = "jdbc:postgresql://" + server + ":" + porta + "/" + mydatabase; + Class.forName(driverName); + + conexao = DriverManager.getConnection(url, username, password); } - public ProdutoDAO(String filename) throws IOException { - file = new File(filename); - produtos = new ArrayList(); - if (file.exists()) { - readFromFile(); - } - + public int getRandomId() { + return (int) (Math.random() * (1000)); } - public void add(Produto produto) { + public boolean close() { + boolean status = false; + try { - produtos.add(produto); - this.maxId = (produto.getId() > this.maxId) ? produto.getId() : this.maxId; - this.saveToFile(); - } catch (Exception e) { - System.out.println("ERRO ao gravar o produto '" + produto.getDescricao() + "' no disco!"); + conexao.close(); + status = true; + } catch (SQLException e) { + System.err.println(e.getMessage()); } + return status; } - public Produto get(int id) { - for (Produto produto : produtos) { - if (id == produto.getId()) { - return produto; + public boolean inserirProduto(Produto produto) { + boolean status = false; + + try { + Statement st = conexao.createStatement(); + st.executeUpdate("INSERT INTO produto (id, descricao, preco, quantidade, dataFabricacao, dataValidade) " + + "VALUES (" + produto.getId() + ", '" + produto.getDescricao() + "', '" + produto.getPreco() + + "', '" + produto.getQuant() + "', '" + produto.getDataFabricacao() + "', '" + + produto.getDataValidade() + "');"); + st.close(); + status = true; + } catch (SQLException u) { + throw new RuntimeException(u); + } + return status; + } + + public boolean atualizarProduto(Produto produto) { + boolean status = false; + try { + Statement st = conexao.createStatement(); + String sql = "UPDATE produto SET descricao = '" + produto.getDescricao() + "', preco = '" + + produto.getPreco() + "', quantidade = '" + produto.getQuant() + "', dataFabricacao = '" + + produto.getDataFabricacao() + "', dataValidade = '" + produto.getDataValidade() + "'" + + " WHERE id = " + produto.getId(); + st.executeUpdate(sql); + st.close(); + status = true; + } catch (SQLException u) { + throw new RuntimeException(u); + } + return status; + } + + public boolean excluirProduto(int id) { + boolean status = false; + try { + Statement st = conexao.createStatement(); + st.executeUpdate("DELETE FROM produto WHERE id = " + id); + st.close(); + status = true; + } catch (SQLException u) { + throw new RuntimeException(u); + } + return status; + } + + public Produto[] getProdutos() { + Produto[] produtos = null; + + try { + Statement st = conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); + ResultSet rs = st.executeQuery("SELECT * FROM produto"); + if (rs.next()) { + rs.last(); + produtos = new Produto[rs.getRow()]; + rs.beforeFirst(); + + for (int i = 0; rs.next(); i++) { + produtos[i] = new Produto(rs.getInt("id"), rs.getString("descricao"), rs.getFloat("preco"), + rs.getInt("quantidade")/* , rs.getDate("dataFabricacao"), rs.getDate("dataFabricacao") */); + } } + st.close(); + } catch (Exception e) { + System.err.println(e.getMessage()); } - return null; - } - - public void update(Produto p) { - int index = produtos.indexOf(p); - if (index != -1) { - produtos.set(index, p); - this.saveToFile(); - } - } - - public void remove(Produto p) { - int index = produtos.indexOf(p); - if (index != -1) { - produtos.remove(index); - this.saveToFile(); - } - } - - public List getAll() { return produtos; } - private List readFromFile() { - produtos.clear(); + public Produto getProduto(int id) { Produto produto = null; - try (FileInputStream fis = new FileInputStream(file); - ObjectInputStream inputFile = new ObjectInputStream(fis)) { - while (fis.available() > 0) { - produto = (Produto) inputFile.readObject(); - produtos.add(produto); - maxId = (produto.getId() > maxId) ? produto.getId() : maxId; - } - } catch (Exception e) { - System.out.println("ERRO ao gravar produto no disco!"); - e.printStackTrace(); - } - return produtos; - } - - private void saveToFile() { try { - fos = new FileOutputStream(file, false); - outputFile = new ObjectOutputStream(fos); - - for (Produto produto : produtos) { - outputFile.writeObject(produto); + Statement st = conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); + ResultSet rs = st.executeQuery("SELECT * FROM produto WHERE produto.id = " + id); + if (rs.first()) { + produto = new Produto(rs.getInt("id"), rs.getString("descricao"), rs.getFloat("preco"), + rs.getInt("quantidade")/* , rs.getDate("dataFabricacao"), rs.getDate("dataFabricacao") */); } - outputFile.flush(); - this.close(); - } catch (Exception e) { - System.out.println("ERRO ao gravar produto no disco!"); - e.printStackTrace(); + st.close(); + } catch (SQLException u) { + throw new RuntimeException(u); } - } - private void close() throws IOException { - outputFile.close(); - fos.close(); - } - - @Override - protected void finalize() throws Throwable { - try { - this.saveToFile(); - this.close(); - } catch (Exception e) { - System.out.println("ERRO ao salvar a base de dados no disco!"); - e.printStackTrace(); - } + return produto; } } diff --git a/src/main/java/model/Produto.java b/src/main/java/model/Produto.java index 286a324..a8181fa 100644 --- a/src/main/java/model/Produto.java +++ b/src/main/java/model/Produto.java @@ -24,6 +24,15 @@ public class Produto implements Serializable { dataValidade = LocalDate.now().plusMonths(6); // o default é uma validade de 6 meses. } + public Produto(int id, String descricao, float preco, int quantidade) { + setId(id); + setDescricao(descricao); + setPreco(preco); + setQuant(quantidade); + dataFabricacao = LocalDateTime.now(); + dataValidade = LocalDate.now().plusMonths(6); // o default é uma validade de 6 meses. + } + public Produto(int id, String descricao, float preco, int quantidade, LocalDateTime fabricacao, LocalDate v) { setId(id); setDescricao(descricao); diff --git a/src/main/java/service/ProdutoService.java b/src/main/java/service/ProdutoService.java index 29c1bc7..223f084 100644 --- a/src/main/java/service/ProdutoService.java +++ b/src/main/java/service/ProdutoService.java @@ -1,9 +1,7 @@ package service; -import java.io.IOException; import java.time.LocalDate; import java.time.LocalDateTime; - import dao.ProdutoDAO; import model.Produto; import spark.Request; @@ -14,9 +12,9 @@ public class ProdutoService { public ProdutoService() { try { - produtoDAO = new ProdutoDAO("produto.dat"); - } catch (IOException e) { - System.out.println(e.getMessage()); + produtoDAO = new ProdutoDAO(); + } catch (Exception e) { + e.printStackTrace(); } } @@ -24,14 +22,16 @@ public class ProdutoService { String descricao = request.queryParams("descricao"); float preco = Float.parseFloat(request.queryParams("preco")); int quantidade = Integer.parseInt(request.queryParams("quantidade")); - LocalDateTime dataFabricacao = LocalDateTime.parse(request.queryParams("dataFabricacao")); - LocalDate dataValidade = LocalDate.parse(request.queryParams("dataValidade")); + // LocalDateTime dataFabricacao = + // LocalDateTime.parse(request.queryParams("dataFabricacao")); + // LocalDate dataValidade = + // LocalDate.parse(request.queryParams("dataValidade")); - int id = produtoDAO.getMaxId() + 1; + int id = produtoDAO.getRandomId(); - Produto produto = new Produto(id, descricao, preco, quantidade, dataFabricacao, dataValidade); + Produto produto = new Produto(id, descricao, preco, quantidade/* , dataFabricacao, dataValidade */); - produtoDAO.add(produto); + produtoDAO.inserirProduto(produto); response.status(201); // 201 Created return id; @@ -40,7 +40,7 @@ public class ProdutoService { public Object get(Request request, Response response) { int id = Integer.parseInt(request.params(":id")); - Produto produto = (Produto) produtoDAO.get(id); + Produto produto = (Produto) produtoDAO.getProduto(id); if (produto != null) { response.header("Content-Type", "application/xml"); @@ -60,7 +60,7 @@ public class ProdutoService { public Object update(Request request, Response response) { int id = Integer.parseInt(request.params(":id")); - Produto produto = (Produto) produtoDAO.get(id); + Produto produto = (Produto) produtoDAO.getProduto(id); if (produto != null) { produto.setDescricao(request.queryParams("descricao")); @@ -69,7 +69,7 @@ public class ProdutoService { produto.setDataFabricacao(LocalDateTime.parse(request.queryParams("dataFabricacao"))); produto.setDataValidade(LocalDate.parse(request.queryParams("dataValidade"))); - produtoDAO.update(produto); + produtoDAO.atualizarProduto(produto); return id; } else { @@ -82,11 +82,11 @@ public class ProdutoService { public Object remove(Request request, Response response) { int id = Integer.parseInt(request.params(":id")); - Produto produto = (Produto) produtoDAO.get(id); + Produto produto = (Produto) produtoDAO.getProduto(id); if (produto != null) { - produtoDAO.remove(produto); + produtoDAO.excluirProduto(id); response.status(200); // success return id; @@ -98,7 +98,7 @@ public class ProdutoService { public Object getAll(Request request, Response response) { StringBuffer returnValue = new StringBuffer(""); - for (Produto produto : produtoDAO.getAll()) { + for (Produto produto : produtoDAO.getProdutos()) { returnValue.append("\n\n" + "\t" + produto.getId() + "\n" + "\t" + produto.getDescricao() + "\n" + "\t" + produto.getPreco() + "\n" + "\t" + produto.getQuant() + "\n" + "\t"