From de4b7150b3262385415b68a45ab60ebd8b147291 Mon Sep 17 00:00:00 2001 From: hacklego Date: Mon, 27 Feb 2017 15:21:41 +0100 Subject: [PATCH] JPA version, problems: * Criteria * Persistence * Persitence Provider --- .../es/uvigo/esei/daa/dao/GenericDAO.java | 72 +++++++ .../java/es/uvigo/esei/daa/dao/PetsDAO.java | 165 +--------------- .../java/es/uvigo/esei/daa/entities/Pet.java | 67 +++---- .../uvigo/esei/daa/rest/PeopleResource.java | 23 --- .../es/uvigo/esei/daa/rest/PetsResource.java | 186 ++++++------------ src/main/resources/META-INF/persistence.xml | 13 ++ 6 files changed, 183 insertions(+), 343 deletions(-) create mode 100644 src/main/java/es/uvigo/esei/daa/dao/GenericDAO.java create mode 100644 src/main/resources/META-INF/persistence.xml diff --git a/src/main/java/es/uvigo/esei/daa/dao/GenericDAO.java b/src/main/java/es/uvigo/esei/daa/dao/GenericDAO.java new file mode 100644 index 0000000..09661d1 --- /dev/null +++ b/src/main/java/es/uvigo/esei/daa/dao/GenericDAO.java @@ -0,0 +1,72 @@ +package es.uvigo.esei.daa.dao; + +import java.lang.reflect.ParameterizedType; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; + +public abstract class GenericDAO { + + protected EntityManagerFactory emf; + protected EntityManager em; + + protected Class entityClass; + + public GenericDAO() { + this.emf = Persistence.createEntityManagerFactory("DAA"); + this.em = emf.createEntityManager(); + } + + private void setEntityClass() { + this.entityClass = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; + } + + public T create(T entity) { + em.getTransaction().begin(); + em.persist(entity); + em.getTransaction().commit(); + return entity; + } + + public T update(T entity) { + em.getTransaction().begin(); + T result = em.merge(entity); + em.getTransaction().commit(); + return result; + } + + public void delete(T entity) { + em.getTransaction().begin(); + em.remove(em.merge(entity)); + em.getTransaction().commit(); + } + + public T findById(Object id) { + if (this.entityClass == null) { + setEntityClass(); + } + + T result = em.find(this.entityClass, id); + return result; + } + + /* + public List findAll() { + if (this.entityClass == null) { + setEntityClass(); + } + + CriteriaBuilder builder = em.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery(this.entityClass); + query.select(query.from(this.entityClass)); + em.getTransaction().begin(); + List result = em.createQuery(query).getResultList(); + em.getTransaction().commit(); + return result; + } + */ +} diff --git a/src/main/java/es/uvigo/esei/daa/dao/PetsDAO.java b/src/main/java/es/uvigo/esei/daa/dao/PetsDAO.java index 4bc62f8..277ad14 100644 --- a/src/main/java/es/uvigo/esei/daa/dao/PetsDAO.java +++ b/src/main/java/es/uvigo/esei/daa/dao/PetsDAO.java @@ -1,165 +1,14 @@ package es.uvigo.esei.daa.dao; -import java.util.logging.Logger; - -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 javax.persistence.EntityManager; 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 id=?"; - - 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 pets = new LinkedList<>(); - - while (result.next()) { - pets.add(rowToEntity(result)); - } - - return pets; - } - } - } catch (SQLException e) { - LOG.log(Level.SEVERE, "Error listing pets", e); - throw new DAOException(e); - } - } - - public List peoplePets(int peopleId) throws DAOException { - try(final Connection conn = this.getConnection()){ - final String query = "SELECT * FROM pets WHERE owner= ?"; - - try(final PreparedStatement stmt = conn.prepareStatement(query)) { - stmt.setInt(1,peopleId); - try(final ResultSet result = stmt.executeQuery()) { - final List pets = new LinkedList<>(); - while (result.next()) { - pets.add(rowToEntity(result)); - } - return pets; - } - } - } catch (SQLException e){ - LOG.log(Level.SEVERE, "Error peoplePets", e); - throw new DAOException(e); - } - } - - public Pet add(Pet pet) - throws DAOException, IllegalArgumentException { - if (pet==null) { - throw new IllegalArgumentException("Pet is null!"); - } - - try (Connection conn = this.getConnection()) { - final String query = "INSERT INTO pets(name, kind, breed, owner) VALUES (?,?,?,?)"; - - try (PreparedStatement statement = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { - statement.setString(1, pet.getName()); - statement.setString(2, pet.getKind()); - statement.setString(3, pet.getBreed()); - statement.setInt(4, pet.getOwner()); - - if (statement.executeUpdate() == 1) { - return pet; - } else { - LOG.log(Level.SEVERE, "Error inserting value"); - throw new SQLException("Error inserting value"); - } - } - } catch (SQLException e) { - LOG.log(Level.SEVERE, "Error adding a pet", e); - throw new DAOException(e); - } - } - - - public void modify(Pet pet) - throws DAOException, IllegalArgumentException { - if (pet == null) { - throw new IllegalArgumentException("pet can't be null"); - } - - try (Connection conn = this.getConnection()) { - final String query = "UPDATE pets SET name=?, kind=?, breed=?, owner=? WHERE id=?"; - - try (PreparedStatement statement = conn.prepareStatement(query)) { - statement.setString(1, pet.getName()); - statement.setString(2, pet.getKind()); - statement.setString(3, pet.getBreed()); - statement.setInt(4,pet.getOwner()); - statement.setInt(5,pet.getId()); - - if (statement.executeUpdate() != 1) { - throw new IllegalArgumentException("name, kind and breed can't be null"); - } - } - } catch (SQLException e) { - LOG.log(Level.SEVERE, "Error modifying a pet", e); - throw new DAOException(); - } - } - - - public void delete(int id) - throws DAOException, IllegalArgumentException { - try (final Connection conn = this.getConnection()) { - final String query = "DELETE FROM pets 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 pet: "+ id, e); - throw new DAOException(e); - } - } +public class PetsDAO extends GenericDAO { - private Pet rowToEntity(ResultSet row) throws SQLException { - return new Pet( - row.getInt("id"), - row.getString("name"), - row.getString("kind"), - row.getString("breed"), - row.getInt("owner") - ); - } + public PetsDAO() { + super(); + } + } + \ No newline at end of file diff --git a/src/main/java/es/uvigo/esei/daa/entities/Pet.java b/src/main/java/es/uvigo/esei/daa/entities/Pet.java index fde74f3..9d27290 100644 --- a/src/main/java/es/uvigo/esei/daa/entities/Pet.java +++ b/src/main/java/es/uvigo/esei/daa/entities/Pet.java @@ -1,31 +1,49 @@ package es.uvigo.esei.daa.entities; -public class Pet { +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.validation.constraints.Size; + +@Entity +public class Pet implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + Long id; + + @Size(min = 0, max = 30) + @Column(length = 30, nullable = false) + String name; - private int id; - private String name; + @Size(min = 0, max = 30) + @Column(length = 30, nullable = false) private String kind; + + @Size(min = 0, max = 30) + @Column(length = 30, nullable = false) private String breed; - private int owner; + + @ManyToOne + Person owner; Pet(){} - public Pet(int id, String name, String kind, String breed, int owner) { - this.setId(id); + public Pet(int id, String name, String kind, String breed, Person owner) { this.setName(name); this.setKind(kind); this.setBreed(breed); this.setOwner(owner); } - public int getId() { + public Long getId() { return id; } - public void setId(int id) { - this.id = id; - } - public String getName() { return name; } @@ -50,34 +68,11 @@ public class Pet { this.breed = breed; } - public int getOwner() { + public Person getOwner() { return owner; } - public void setOwner(int owner) { + public void setOwner(Person owner) { this.owner = owner; } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = (int) (prime * result + id); - return result; - } - - @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/PeopleResource.java b/src/main/java/es/uvigo/esei/daa/rest/PeopleResource.java index 459acc2..f902574 100644 --- a/src/main/java/es/uvigo/esei/daa/rest/PeopleResource.java +++ b/src/main/java/es/uvigo/esei/daa/rest/PeopleResource.java @@ -210,27 +210,4 @@ public class PeopleResource { .build(); } } - - @GET - @Path("/{id}/pets/") - public Response personsPets( - @PathParam("id") int id - ) { - this.pets = new PetsDAO(); - try { - return Response.ok(this.pets.peoplePets(id)).build(); - } catch (IllegalArgumentException iae) { - LOG.log(Level.FINE, "Invalid pet 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 pet", e); - - return Response.serverError() - .entity(e.getMessage()) - .build(); - } - } } diff --git a/src/main/java/es/uvigo/esei/daa/rest/PetsResource.java b/src/main/java/es/uvigo/esei/daa/rest/PetsResource.java index e08f503..609c138 100644 --- a/src/main/java/es/uvigo/esei/daa/rest/PetsResource.java +++ b/src/main/java/es/uvigo/esei/daa/rest/PetsResource.java @@ -1,160 +1,94 @@ package es.uvigo.esei.daa.rest; -import java.util.logging.Level; -import java.util.logging.Logger; - +import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; -import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import es.uvigo.esei.daa.dao.DAOException; + +import java.util.List; + import es.uvigo.esei.daa.dao.PetsDAO; import es.uvigo.esei.daa.entities.Pet; @Path("/pets") @Produces(MediaType.APPLICATION_JSON) public class PetsResource { - private final static Logger LOG = Logger.getLogger(PetsResource.class.getName()); - - private final PetsDAO dao; - - - public PetsResource() { - this(new PetsDAO()); - } - - // Needed for testing purposes - PetsResource(PetsDAO dao) { - this.dao = dao; - } - + private final PetsDAO dao; + + /** + * Constructs a new instance of {@link PeopleResource}. + */ + public PetsResource() { + this(new PetsDAO()); + } + + // Needed for testing purposes + PetsResource(PetsDAO dao) { + this.dao = dao; + } + + /* @GET - @Path("/{id}") - public Response get( - @PathParam("id") int id - ) { - try { - final Pet pet = this.dao.get(id); - - return Response.ok(pet).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(); - } - } - + @Produces({MediaType.APPLICATION_JSON}) + public Response searchPets() { + List pets = dao.findAll(); + GenericEntity> entidadJSON = new GenericEntity>(pets) {}; + return Response.ok(entidadJSON).build(); + }*/ + @GET - public Response list() { - try { - return Response.ok(this.dao.list()).build(); - } catch (DAOException e) { - LOG.log(Level.SEVERE, "Error listing pets", e); - return Response.serverError().entity(e.getMessage()).build(); + @Produces({MediaType.APPLICATION_JSON}) + @Path("{id:[0­9]+}") + public Response buscarAutor(@PathParam("id") Long id) { + Pet pet = dao.findById(id); + if (pet != null) { + return Response.ok(pet).build(); + } else { + return Response.status(Response.Status.NOT_FOUND).build(); } } - - + @POST - public Response add( - @FormParam("name") String name, - @FormParam("kind") String kind, - @FormParam("breed") String breed, - @FormParam("owner") int owner - ) { + @Consumes({MediaType.APPLICATION_JSON}) + public Response createPet(Pet pet) { try { - Pet newPet = new Pet(0, name, kind, breed, owner); - newPet = this.dao.add(newPet); + Pet newPet = dao.create(pet); return Response.ok(newPet).build(); - } catch (IllegalArgumentException | NullPointerException iae) { - LOG.log(Level.FINE, "Invalid pet id in add method", iae); - - return Response.status(Response.Status.BAD_REQUEST) - .entity(iae.getMessage()) - .build(); - } catch (DAOException e) { - LOG.log(Level.SEVERE, "Error adding this pet " + name +" breed: "+ breed, e); - - return Response.serverError() - .entity(e.getMessage()) - .build(); + } catch (Exception e) { + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); } } - + @PUT - @Path("/{id}") - public Response modify( - @PathParam("id") int id, - @FormParam("name") String name, - @FormParam("kind") String kind, - @FormParam("breed") String breed, - @FormParam("owner") int owner - ) { + @Consumes({MediaType.APPLICATION_JSON}) + @Path("{id:[0­9]+}") + public Response updatePet(Pet pet) { try { - final Pet pet = new Pet(id, name, kind, breed, owner); - this.dao.modify(pet); - - return Response.ok(pet).build(); - } catch (NullPointerException npe) { - final String message = "Invalid data for pet" + " id: " + id + " name: " + name + " kind: " - + kind + " breed: " + breed + " owner: " + owner; - - LOG.log(Level.FINE, message); - - return Response.status(Response.Status.BAD_REQUEST) - .entity(message) - .build(); - } catch (IllegalArgumentException iae) { - LOG.log(Level.FINE, "Invalid pet id in modify method", iae); - - return Response.status(Response.Status.BAD_REQUEST) - .entity(iae.getMessage()) - .build(); - } catch (DAOException e) { - LOG.log(Level.SEVERE, "Error modifying a pet", e); - - return Response.serverError() - .entity(e.getMessage()) - .build(); + dao.update(pet); + return Response.noContent().build(); + } catch (Exception e) { + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); } } - + @DELETE - @Path("/{id}") - public Response delete( - @PathParam("id") int id - ) { - try { - this.dao.delete(id); - - return Response.ok(id).build(); - } catch (IllegalArgumentException iae) { - LOG.log(Level.FINE, "Invalid pet id in delete method", iae); - - return Response.status(Response.Status.BAD_REQUEST) - .entity(iae.getMessage()) - .build(); - } catch (DAOException e) { - LOG.log(Level.SEVERE, "Error deleting a pet", e); - - return Response.serverError() - .entity(e.getMessage()) - .build(); + @Path("{id:[0­9]+}") + public Response deletePet(@PathParam("id") Long id) { + Pet pet = dao.findById(id); + if (pet != null) { + dao.delete(pet); + return Response.noContent().build(); + } else { + return Response.status(Response.Status.NOT_FOUND).build(); } } -} + +} \ No newline at end of file diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..43c7397 --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file -- 2.18.1