From f004b2f180aaee9e10414dee64f9cc1696f2f487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Barciela=20Mart=C3=ADn?= Date: Tue, 13 Mar 2018 16:39:45 +0100 Subject: [PATCH] Add pet entitie, DAO, Resource --- .gitignore | 17 ++ db/mysql-with-inserts.sql | 18 ++ .../uvigo/esei/daa/DAAExampleApplication.java | 4 +- .../java/es/uvigo/esei/daa/dao/PetsDAO.java | 164 ++++++++++++++++++ .../java/es/uvigo/esei/daa/entities/Pet.java | 58 +++++++ .../es/uvigo/esei/daa/rest/PetResource.java | 41 +++++ 6 files changed, 301 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 src/main/java/es/uvigo/esei/daa/dao/PetsDAO.java create mode 100644 src/main/java/es/uvigo/esei/daa/entities/Pet.java create mode 100644 src/main/java/es/uvigo/esei/daa/rest/PetResource.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..88063ce --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# General +/bak + +# Eclipse +.project +.classpath +.settings +WebContent + +# Maven +/bin +/target +/assembly + +# Testing +/servers +C:\\nppdf32Log\\debuglog.txt diff --git a/db/mysql-with-inserts.sql b/db/mysql-with-inserts.sql index d420e40..ce61228 100644 --- a/db/mysql-with-inserts.sql +++ b/db/mysql-with-inserts.sql @@ -13,8 +13,18 @@ CREATE TABLE `daaexample`.`users` ( PRIMARY KEY (`login`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `daaexample`.`pets` ( + `idPet` int NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `idOwner` int NOT NULL, + PRIMARY KEY (`idPet`), + FOREING KEY (`idOwner`) REFERENCES people(id), +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + GRANT ALL ON `daaexample`.* TO 'daa'@'localhost' IDENTIFIED BY 'daa'; +-- INSERTS IN PEOPLE -- + INSERT INTO `daaexample`.`people` (`id`,`name`,`surname`) VALUES (0,'Antón','Pérez'); INSERT INTO `daaexample`.`people` (`id`,`name`,`surname`) VALUES (0,'Manuel','Martínez'); INSERT INTO `daaexample`.`people` (`id`,`name`,`surname`) VALUES (0,'Laura','Reboredo'); @@ -24,6 +34,14 @@ INSERT INTO `daaexample`.`people` (`id`,`name`,`surname`) VALUES (0,'María','Nu INSERT INTO `daaexample`.`people` (`id`,`name`,`surname`) VALUES (0,'Alba','Fernández'); INSERT INTO `daaexample`.`people` (`id`,`name`,`surname`) VALUES (0,'Asunción','Jiménez'); +-- INSERTS IN PETS -- +INSERT INTO `daaexample`.`pets` (`idPet`,`name`,`id`) VALUES (0,'Perro',0); +INSERT INTO `daaexample`.`pets` (`idPet`,`name`,`id`) VALUES (0,'Gato',1); +INSERT INTO `daaexample`.`pets` (`idPet`,`name`,`id`) VALUES (0,'Loro',2); +INSERT INTO `daaexample`.`pets` (`idPet`,`name`,`id`) VALUES (0,'Serpiente',3); +INSERT INTO `daaexample`.`pets` (`idPet`,`name`,`id`) VALUES (0,'Rata',0); + + -- The password for each user is its login suffixed with "pass". For example, user "admin" has the password "adminpass". INSERT INTO `daaexample`.`users` (`login`,`password`) VALUES ('admin', '43f413b773f7d0cfad0e8e6529ec1249ce71e8697919eab30d82d800a3986b70'); INSERT INTO `daaexample`.`users` (`login`,`password`) VALUES ('normal', '688f21dd2d65970f174e2c9d35159250a8a23e27585452683db8c5d10b586336'); diff --git a/src/main/java/es/uvigo/esei/daa/DAAExampleApplication.java b/src/main/java/es/uvigo/esei/daa/DAAExampleApplication.java index 2a67f22..0df167d 100644 --- a/src/main/java/es/uvigo/esei/daa/DAAExampleApplication.java +++ b/src/main/java/es/uvigo/esei/daa/DAAExampleApplication.java @@ -11,6 +11,7 @@ import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; import es.uvigo.esei.daa.rest.PeopleResource; +import es.uvigo.esei.daa.rest.PetResource; import es.uvigo.esei.daa.rest.UsersResource; /** @@ -26,7 +27,8 @@ public class DAAExampleApplication extends Application { public Set> getClasses() { return Stream.of( PeopleResource.class, - UsersResource.class + UsersResource.class, + PetResource.class ).collect(toSet()); } diff --git a/src/main/java/es/uvigo/esei/daa/dao/PetsDAO.java b/src/main/java/es/uvigo/esei/daa/dao/PetsDAO.java new file mode 100644 index 0000000..3364488 --- /dev/null +++ b/src/main/java/es/uvigo/esei/daa/dao/PetsDAO.java @@ -0,0 +1,164 @@ +package es.uvigo.esei.daa.dao; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.LinkedList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import es.uvigo.esei.daa.entities.Person; +import es.uvigo.esei.daa.entities.Pet; + +public class PetsDAO extends DAO{ + private final static Logger LOG = Logger.getLogger(PetsDAO.class.getName()); + + + public Pet get(int id) + throws DAOException, IllegalArgumentException { + try (final Connection conn = this.getConnection()) { + final String query = "SELECT * FROM pets WHERE idPet=?"; + + try (final PreparedStatement statement = conn.prepareStatement(query)) { + statement.setInt(1, id); + + try (final ResultSet result = statement.executeQuery()) { + if (result.next()) { + return rowToEntity(result); + } else { + throw new IllegalArgumentException("Invalid id"); + } + } + } + } catch (SQLException e) { + LOG.log(Level.SEVERE, "Error getting a pet", e); + throw new DAOException(e); + } + } + + + + public List list() throws DAOException { + try (final Connection conn = this.getConnection()) { + final String query = "SELECT * FROM pets"; + + try (final PreparedStatement statement = conn.prepareStatement(query)) { + try (final ResultSet result = statement.executeQuery()) { + final List pet = new LinkedList<>(); + + while (result.next()) { + pet.add(rowToEntity(result)); + } + + return pet; + } + } + } catch (SQLException e) { + LOG.log(Level.SEVERE, "Error listing people", e); + throw new DAOException(e); + } + } + + + + public Person add(String name, String surname) + throws DAOException, IllegalArgumentException { + if (name == null || surname == null) { + throw new IllegalArgumentException("name and surname can't be null"); + } + + try (Connection conn = this.getConnection()) { + final String query = "INSERT INTO people VALUES(null, ?, ?)"; + + try (PreparedStatement statement = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { + statement.setString(1, name); + statement.setString(2, surname); + + if (statement.executeUpdate() == 1) { + try (ResultSet resultKeys = statement.getGeneratedKeys()) { + if (resultKeys.next()) { + return new Person(resultKeys.getInt(1), name, surname); + } else { + LOG.log(Level.SEVERE, "Error retrieving inserted id"); + throw new SQLException("Error retrieving inserted id"); + } + } + } else { + LOG.log(Level.SEVERE, "Error inserting value"); + throw new SQLException("Error inserting value"); + } + } + } catch (SQLException e) { + LOG.log(Level.SEVERE, "Error adding a person", e); + throw new DAOException(e); + } + } + + + public void modify(Person person) + throws DAOException, IllegalArgumentException { + if (person == null) { + throw new IllegalArgumentException("person can't be null"); + } + + try (Connection conn = this.getConnection()) { + final String query = "UPDATE people SET name=?, surname=? WHERE id=?"; + + try (PreparedStatement statement = conn.prepareStatement(query)) { + statement.setString(1, person.getName()); + statement.setString(2, person.getSurname()); + statement.setInt(3, person.getId()); + + if (statement.executeUpdate() != 1) { + throw new IllegalArgumentException("name and surname can't be null"); + } + } + } catch (SQLException e) { + LOG.log(Level.SEVERE, "Error modifying a person", e); + throw new DAOException(); + } + } + + + + public void delete(int id) + throws DAOException, IllegalArgumentException { + try (final Connection conn = this.getConnection()) { + final String query = "DELETE FROM people WHERE id=?"; + + try (final PreparedStatement statement = conn.prepareStatement(query)) { + statement.setInt(1, id); + + if (statement.executeUpdate() != 1) { + throw new IllegalArgumentException("Invalid id"); + } + } + } catch (SQLException e) { + LOG.log(Level.SEVERE, "Error deleting a person", e); + throw new DAOException(e); + } + } + + private Pet rowToEntity(ResultSet row) throws SQLException { + return new Pet( + row.getInt("id"), + row.getString("name"), + row.getInt("idOwner") + ); + } + + + + + + + + + + + + +} diff --git a/src/main/java/es/uvigo/esei/daa/entities/Pet.java b/src/main/java/es/uvigo/esei/daa/entities/Pet.java new file mode 100644 index 0000000..054cdad --- /dev/null +++ b/src/main/java/es/uvigo/esei/daa/entities/Pet.java @@ -0,0 +1,58 @@ +package es.uvigo.esei.daa.entities; + +import static java.util.Objects.requireNonNull; + +public class Pet { + private int id; + private String name; + private int idOwner; + + + Pet() {} + + public Pet(int id, String name, int idOwner) { + this.id = id; + this.setName(name); + this.setOwner(idOwner); + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public int getIdOwner() { + return idOwner; + } + + public void setId(int id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + + public void setOwner(int idOwner) { + this.idOwner = idOwner; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof Pet)) + return false; + Pet other = (Pet) obj; + if (id != other.id) + return false; + return true; + } + + +} diff --git a/src/main/java/es/uvigo/esei/daa/rest/PetResource.java b/src/main/java/es/uvigo/esei/daa/rest/PetResource.java new file mode 100644 index 0000000..00ce05b --- /dev/null +++ b/src/main/java/es/uvigo/esei/daa/rest/PetResource.java @@ -0,0 +1,41 @@ +package es.uvigo.esei.daa.rest; + +import java.util.logging.Level; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import es.uvigo.esei.daa.dao.DAOException; +import es.uvigo.esei.daa.entities.Person; + +@Path("/pets") +@Produces(MediaType.APPLICATION_JSON) +public class PetResource { + + @GET + @Path("/{idPet}") + public Response get(@PathParam("idPet") int idPet) { + try { + final Person person = this.dao.get(id); + + return Response.ok(person).build(); + } catch (IllegalArgumentException iae) { + LOG.log(Level.FINE, "Invalid person id in get method", iae); + + return Response.status(Response.Status.BAD_REQUEST) + .entity(iae.getMessage()) + .build(); + } catch (DAOException e) { + LOG.log(Level.SEVERE, "Error getting a person", e); + + return Response.serverError() + .entity(e.getMessage()) + .build(); + } + } + +} -- 2.18.1