Skip to content

Weka #4

Merged
merged 7 commits into from
Apr 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions emmas/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,23 @@

<dependency>
<groupId>nz.ac.waikato.cms.weka</groupId>
<artifactId>weka-stable</artifactId>
<version>3.8.6</version>
<artifactId>weka-dev</artifactId>
<version>3.9.6</version>
</dependency>

<dependency>
<groupId>nz.ac.waikato.cms.weka</groupId>
<artifactId>SMOTE</artifactId>
<version>1.0.3</version>
</dependency>

<dependency>
<groupId>nz.ac.waikato.cms.weka</groupId>
<artifactId>naiveBayesTree</artifactId>
<version>1.0.2</version>
</dependency>


<!-- Jakarta Activation -->
<dependency>
<groupId>jakarta.activation</groupId>
Expand Down Expand Up @@ -114,6 +127,11 @@
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
<version>0.4</version>
</dependency>

</dependencies>

Expand Down
46 changes: 29 additions & 17 deletions emmas/src/main/java/dev/brianweloba/dao/EventDAO.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package dev.brianweloba.dao;

import java.util.List;

import dev.brianweloba.model.Event;
import dev.brianweloba.util.HibernateUtil;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import jakarta.transaction.Transactional;

import java.util.List;

public class EventDAO {

@Transactional
Expand All @@ -28,15 +28,15 @@ public Event create(Event event) {
}
}

public int countAll(){
public int countAll() {
try (EntityManager manager = HibernateUtil.getEntityManager()) {
return manager.createQuery("SELECT COUNT(e) FROM Event e", Long.class)
.getSingleResult()
.intValue();
}
}

public List<Event> findPaginated(int startIndex, int pageSize){
public List<Event> findPaginated(int startIndex, int pageSize) {
try (EntityManager manager = HibernateUtil.getEntityManager()) {
return manager.createQuery("SELECT e FROM Event e ORDER BY e.eventDate", Event.class)
.setFirstResult(startIndex)
Expand All @@ -48,6 +48,7 @@ public List<Event> findPaginated(int startIndex, int pageSize){
public List<Event> search(String query) {
try (EntityManager manager = HibernateUtil.getEntityManager()) {
String searchTerm = "%" + query.toLowerCase() + "%";

return manager.createQuery(
"SELECT e FROM Event e LEFT JOIN FETCH e.rsvps WHERE " +
" LOWER(e.title) LIKE :query OR" +
Expand All @@ -66,7 +67,7 @@ public Event findById(Long id) {
}
}

public Event findByIdAndToken(Long id,String token){
public Event findByIdAndToken(Long id, String token) {
EntityManager manager = HibernateUtil.getEntityManager();
try {
TypedQuery<Event> query = manager.createQuery(
Expand All @@ -78,36 +79,37 @@ public Event findByIdAndToken(Long id,String token){
System.out.println("Id: " + id);
System.out.println("Query: " + query);
return query.getSingleResult();
}catch (Exception e) {
} catch (Exception e) {
if (manager.getTransaction().isActive()) {
manager.getTransaction().rollback();
}
throw e;
}finally {
} finally {
manager.close();
}
}

public List<Event> findAll() {
public List<Event> findAll() {
try (EntityManager manager = HibernateUtil.getEntityManager()) {
TypedQuery<Event> query = manager.createQuery(
return manager.createQuery(
"SELECT DISTINCT e FROM Event e LEFT JOIN FETCH e.rsvps ORDER BY e.eventDate",
Event.class
);
return query.getResultList();
).getResultList();
}
}


public void update(Event event, String token) {
EntityManager manager = HibernateUtil.getEntityManager();
try {
Event eventToUpdate = findByIdAndToken(event.getId(),token);
if(eventToUpdate == null){
Event eventToUpdate = findByIdAndToken(event.getId(), token);
if (eventToUpdate == null) {
return;
}
manager.getTransaction().begin();

eventToUpdate.setTitle(event.getTitle());
eventToUpdate.setEventHost(event.getEventHost());
eventToUpdate.setEventType(event.getEventType());
eventToUpdate.setEventLocation(event.getEventLocation());
eventToUpdate.setDescription(event.getDescription());
Expand All @@ -126,15 +128,25 @@ public void update(Event event, String token) {
}
}

public void delete(Long id) {
public boolean delete(Long id, String token) {
EntityManager manager = HibernateUtil.getEntityManager();
try {
manager.getTransaction().begin();
Event event = manager.find(Event.class, id);
if (event != null) {
manager.remove(event);
Event event = manager.createQuery(
"SELECT e FROM Event e WHERE e.id = :id AND e.editToken = :token", Event.class)
.setParameter("id", id)
.setParameter("token", token)
.getResultList()
.stream()
.findFirst()
.orElse(null);

if (event == null) {
return false;
}
manager.remove(event);
manager.getTransaction().commit();
return true;
} catch (Exception e) {
if (manager.getTransaction().isActive()) {
manager.getTransaction().rollback();
Expand Down
67 changes: 58 additions & 9 deletions emmas/src/main/java/dev/brianweloba/dao/RsvpDAO.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@
import dev.brianweloba.model.RSVP;
import dev.brianweloba.util.HibernateUtil;
import jakarta.persistence.EntityManager;
import jakarta.persistence.NoResultException;

import java.util.List;

public class RsvpDAO {
public RSVP create(RSVP rsvp,Long eventId) {
public void create(RSVP rsvp, Long eventId) {
EntityManager manager = HibernateUtil.getEntityManager();
try {
manager.getTransaction().begin();
Expand All @@ -16,23 +19,23 @@ public RSVP create(RSVP rsvp,Long eventId) {
throw new IllegalArgumentException("Event not found");
}

Long currentGuests = manager.createQuery(
"SELECT SUM(r.guests) FROM RSVP r WHERE r.event = :event", Long.class)
.setParameter("event", event)
.getSingleResult();
boolean alreadyExists = checkExistingRsvp(manager, event, rsvp.getEmail());
if (alreadyExists) {
throw new IllegalArgumentException("Email already registered for this event");
}

currentGuests = currentGuests == null ? 0 : currentGuests;
Long currentGuests = getCurrentGuestCount(manager, event);

int guestCount = rsvp.getGuests();
if (currentGuests + guestCount > event.getEventCapacity()) {
if (currentGuests + rsvp.getGuests() > event.getEventCapacity()) {
throw new IllegalArgumentException("Event has reached capacity");
}

rsvp.setEvent(event);
event.getRsvps().add(rsvp);

manager.persist(rsvp);
manager.getTransaction().commit();
return rsvp;

} catch (Exception e) {
if (manager.getTransaction().isActive()) {
manager.getTransaction().rollback();
Expand All @@ -42,4 +45,50 @@ public RSVP create(RSVP rsvp,Long eventId) {
manager.close();
}
}

private boolean checkExistingRsvp(EntityManager manager, Event event, String email) {
try {
return manager.createQuery(
"SELECT COUNT(r) > 0 FROM RSVP r " +
"WHERE r.event = :event AND LOWER(r.email) = LOWER(:email)",
Boolean.class)
.setParameter("event", event)
.setParameter("email", email)
.getSingleResult();
} catch (NoResultException e) {
return false;
}
}

private Long getCurrentGuestCount(EntityManager manager, Event event) {
try {
Long count = manager.createQuery(
"SELECT SUM(r.guests) FROM RSVP r WHERE r.event = :event",
Long.class)
.setParameter("event", event)
.getSingleResult();
return count != null ? count : 0L;
} catch (NoResultException e) {
return 0L;
}
}

public List<RSVP> getEventAttendees(Long eventId) {
try (EntityManager manager = HibernateUtil.getEntityManager()) {
return manager.createQuery("SELECT r FROM RSVP r WHERE r.event.id = :eventId", RSVP.class)
.setParameter("eventId", eventId)
.getResultList();
}
}

// Additional useful method
public Event findEventWithRsvps(Long eventId) {
try (EntityManager manager = HibernateUtil.getEntityManager()) {
return manager.createQuery(
"SELECT e FROM Event e LEFT JOIN FETCH e.rsvps WHERE e.id = :id",
Event.class)
.setParameter("id", eventId)
.getSingleResult();
}
}
}
44 changes: 44 additions & 0 deletions emmas/src/main/java/dev/brianweloba/dao/UserDAO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package dev.brianweloba.dao;

import dev.brianweloba.model.User;
import dev.brianweloba.util.HibernateUtil;
import jakarta.persistence.EntityManager;
import jakarta.persistence.NoResultException;

public class UserDAO {
public User findByUsername(String username) {
try (EntityManager manager = HibernateUtil.getEntityManager()) {
return manager.createQuery("SELECT u FROM User u WHERE u.username = :username", User.class)
.setParameter("username", username)
.getSingleResult();
} catch (NoResultException e) {
return null;
}
}

public User findByEmail(String email) {
try (EntityManager manager = HibernateUtil.getEntityManager()) {
return manager.createQuery("SELECT u FROM User u WHERE u.email = :email", User.class)
.setParameter("email", email)
.getSingleResult();
} catch (NoResultException e) {
return null;
}
}

public void save(User user) {
EntityManager manager = HibernateUtil.getEntityManager();
try {
manager.getTransaction().begin();
manager.persist(user);
manager.getTransaction().commit();
} catch (Exception e) {
if (manager.getTransaction().isActive()) {
manager.getTransaction().rollback();
}
throw e;
} finally {
manager.close();
}
}
}
27 changes: 27 additions & 0 deletions emmas/src/main/java/dev/brianweloba/filter/AuthFilter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package dev.brianweloba.filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

@WebFilter("/events/*")
public class AuthFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;

HttpSession session = httpRequest.getSession(false);

if (session == null || session.getAttribute("user") == null) {
httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");
} else {
chain.doFilter(request, response);
}
}
}
32 changes: 28 additions & 4 deletions emmas/src/main/java/dev/brianweloba/model/Event.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@

import jakarta.persistence.*;
import jakarta.validation.constraints.*;
import lombok.Data;
import lombok.*;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

@Entity
@Table(name = "events")
@Data
@Getter @Setter @ToString(exclude = "rsvps")
@NoArgsConstructor
public class Event {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down Expand Up @@ -52,8 +54,8 @@ public class Event {
@Column(name = "event_capacity")
private int eventCapacity;

@OneToMany(mappedBy = "event",fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<RSVP> rsvps;
@OneToMany(mappedBy = "event", cascade = CascadeType.ALL,orphanRemoval = true)
private Set<RSVP> rsvps = new HashSet<>();

@Column(nullable = false, unique = true, length = 36, name = "edit_token")
private String editToken;
Expand All @@ -64,4 +66,26 @@ public void generateEditToken() {
this.editToken = UUID.randomUUID().toString();
}
}

public void addRsvp(RSVP rsvp) {
rsvps.add(rsvp);
rsvp.setEvent(this);
}

public void removeRsvp(RSVP rsvp) {
rsvps.remove(rsvp);
rsvp.setEvent(null);
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Event)) return false;
return id != null && id.equals(((Event) o).getId());
}

@Override
public int hashCode() {
return getClass().hashCode();
}
}
Loading