diff --git a/Icon.png b/Icon.png index b9c666c..b978900 100644 Binary files a/Icon.png and b/Icon.png differ diff --git a/cmd/jws/main.go b/cmd/jws/main.go index 7a48054..e7737e9 100644 --- a/cmd/jws/main.go +++ b/cmd/jws/main.go @@ -100,9 +100,9 @@ func createMainWindow(a fyne.App, config *config.Config) { standartProjects := []project.Project{ { - Name: "JakartaEE Todo-App mit Servlet", - Description: "Eine Todo-Anwendung mit Jakarta Servlet und\nPostgreSQL-Datenbank.", - FolderName: "jakarta-servlet-todo", + Name: "JakartaEE Todo-App mit Server Faces", + Description: "Eine Todo-Anwendung mit Jakarta Faces und\nPostgreSQL-Datenbank.", + FolderName: "jakarta-faces-todo", }, { Name: "JakartaEE Todo-App mit JSP", diff --git a/cmd/jws/projects/jakarta-faces-todo/.devcontainer/.dockerignore b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/.dockerignore new file mode 100644 index 0000000..017b280 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/.dockerignore @@ -0,0 +1,8 @@ +.git +.github +.settings +target +*.iml +.idea +.vscode +node_modules diff --git a/cmd/jws/projects/jakarta-faces-todo/.devcontainer/.gitignore b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/.gitignore new file mode 100644 index 0000000..82b069a --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/.gitignore @@ -0,0 +1,27 @@ +# Maven +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +# IDE-spezifische Dateien +.idea/ +*.iws +*.iml +*.ipr +.vscode/ +.settings/ +.classpath +.project +.factorypath + +# Temporäre Dateien +*.log +*.tmp +*.temp + +# Lokale Konfigurationsdateien +src/main/resources/application-local.properties + +# Devcontainer Volumen +.devcontainer/postgres-data/ diff --git a/cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile new file mode 100644 index 0000000..e9d615d --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile @@ -0,0 +1,12 @@ +FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi + +COPY --chown=1001:0 src/main/liberty/config /config +# # Verzeichnis erstellen und PostgreSQL JDBC-Treiber herunterladen +RUN mkdir -p /config/lib && \ + curl -o /config/lib/postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.6.0.jar + +RUN features.sh + +#COPY --chown=1001:0 target/*.war /config/apps + +RUN configure.sh diff --git a/cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile.dev b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile.dev new file mode 100644 index 0000000..412eb57 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile.dev @@ -0,0 +1,14 @@ +FROM mcr.microsoft.com/devcontainers/java:1-21-bullseye + +#ARG INSTALL_MAVEN="true" +#ARG MAVEN_VERSION="" + +#ARG INSTALL_GRADLE="false" +#ARG GRADLE_VERSION="" + +#RUN if [ "${INSTALL_MAVEN}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/sdkman/bin/sdkman-init.sh && sdk install maven \"${MAVEN_VERSION}\""; fi \ +# && if [ "${INSTALL_GRADLE}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/sdkman/bin/sdkman-init.sh && sdk install gradle \"${GRADLE_VERSION}\""; fi + +# Hier kannst du zusätzliche Tools oder Bibliotheken installieren, die du für die Entwicklung benötigst. +# Zum Beispiel den PostgreSQL JDBC-Treiber, wenn du ihn für die Entwicklung benötigst: +RUN apt-get update && apt-get install -y curl && curl -o /tmp/postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.6.0.jar && mkdir -p /usr/local/lib/ && mv /tmp/postgresql.jar /usr/local/lib/postgresql.jar diff --git a/cmd/jws/projects/jakarta-faces-todo/.devcontainer/devcontainer.json b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/devcontainer.json new file mode 100644 index 0000000..a1901d5 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/devcontainer.json @@ -0,0 +1,14 @@ +{ + "name": "Java & PostgreSQL", + "dockerComposeFile": "docker-compose.yml", + "service": "app", + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", + "forwardPorts": [9080, 5432, 9433], + "postCreateCommand": "mvn clean install -DskipTests", + "remoteUser": "vscode", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {"version": "latest"}, + "ghcr.io/devcontainers-extra/features/maven-sdkman:2": {"version": "latest"}, + "ghcr.io/devcontainers/features/git:1": {"version": "latest"} +} +} diff --git a/cmd/jws/projects/jakarta-faces-todo/.devcontainer/docker-compose.yml b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..3141d45 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/docker-compose.yml @@ -0,0 +1,60 @@ +services: + app: + container_name: javadev + build: + context: ../ + dockerfile: .devcontainer/Dockerfile.dev + volumes: + - ../..:/workspaces:cached + - ./app:/app + environment: + POSTGRES_HOST: postgresdb + POSTGRES_PORT: 5432 + POSTGRES_DB: postgres + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + networks: + - my_network + command: sleep infinity + + openliberty: + container_name: openliberty_app + build: + context: ../ + dockerfile: .devcontainer/Dockerfile + ports: + - "9080:9080" + - "9443:9443" + environment: + POSTGRES_HOST: postgresdb + POSTGRES_PORT: 5432 + POSTGRES_DB: todo_db + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + volumes: + - ./app:/config/dropins + depends_on: + - db + networks: + - my_network + + db: + container_name: postgresdb + image: postgres:latest + restart: unless-stopped + volumes: + - postgres-data:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql + environment: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + POSTGRES_DB: todo_db + networks: + - my_network + +volumes: + postgres-data: + +networks: + my_network: + driver: bridge diff --git a/cmd/jws/projects/jakarta-faces-todo/.devcontainer/init.sql b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/init.sql new file mode 100644 index 0000000..9d98295 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/init.sql @@ -0,0 +1,17 @@ +CREATE TABLE users ( + id SERIAL PRIMARY KEY, + username VARCHAR(255) NOT NULL UNIQUE, + password VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL +); + +CREATE TABLE todos ( + id SERIAL PRIMARY KEY, + title VARCHAR(255) NOT NULL, + description VARCHAR(1000), + target_date DATE, + completed BOOLEAN, + user_id BIGINT NOT NULL, + FOREIGN KEY (user_id) REFERENCES users(id) +); + diff --git a/cmd/jws/projects/jakarta-faces-todo/pom.xml b/cmd/jws/projects/jakarta-faces-todo/pom.xml new file mode 100644 index 0000000..f96bbf1 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + + com.todoapp + todo-app + 1.0-SNAPSHOT + war + + + UTF-8 + 17 + 17 + 10.0.0 + 6.2.5.Final + 42.6.0 + + + + + + jakarta.platform + jakarta.jakartaee-api + ${jakartaee.version} + provided + + + + + org.hibernate.orm + hibernate-core + ${hibernate.version} + + + + + org.postgresql + postgresql + ${postgresql.version} + + + + + + jakarta.websocket + jakarta.websocket-api + 2.1.0 + provided + + + + + org.hibernate + hibernate-core + 6.3.1.Final + + + + at.favre.lib + bcrypt + 0.10.2 + + + + + todo-app + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + + org.apache.maven.plugins + maven-war-plugin + 3.3.2 + + + io.openliberty.tools + liberty-maven-plugin + 3.7.1 + + + + diff --git a/cmd/jws/projects/jakarta-faces-todo/server.xml b/cmd/jws/projects/jakarta-faces-todo/server.xml new file mode 100644 index 0000000..56b007e --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/server.xml @@ -0,0 +1,34 @@ + + + + + servlet-6.0 + pages-3.1 + jdbc-4.2 + jndi-1.0 + monitor-1.0 + faces-4.0 + + + + + + + + + + + + + + + + + + diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/AuthBean.java b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/AuthBean.java new file mode 100644 index 0000000..4964df7 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/AuthBean.java @@ -0,0 +1,133 @@ +package com.todoapp.bean; + +import at.favre.lib.crypto.bcrypt.BCrypt; +import com.todoapp.dao.UserDAO; +import com.todoapp.model.User; +import jakarta.enterprise.context.SessionScoped; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import java.io.Serializable; + +@Named +@SessionScoped +public class AuthBean implements Serializable { + + @Inject + private UserDAO userDAO; + + private User user = new User(); + private String confirmPassword; + + public String login() { + User foundUser = userDAO + .getUserByUsername(user.getUsername()) + .orElse(null); + if ( + foundUser != null && + BCrypt.verifyer() + .verify( + user.getPassword().toCharArray(), + foundUser.getPassword() + ) + .verified + ) { + FacesContext.getCurrentInstance() + .getExternalContext() + .getSessionMap() + .put("user", foundUser); + return "todo-list?faces-redirect=true"; + } else { + FacesContext.getCurrentInstance() + .addMessage( + null, + new FacesMessage( + FacesMessage.SEVERITY_ERROR, + "Invalid username or password", + null + ) + ); + return null; + } + } + + public String register() { + if (!user.getPassword().equals(confirmPassword)) { + FacesContext.getCurrentInstance() + .addMessage( + null, + new FacesMessage( + FacesMessage.SEVERITY_ERROR, + "Passwords do not match", + null + ) + ); + return null; + } + if (userDAO.usernameExists(user.getUsername())) { + FacesContext.getCurrentInstance() + .addMessage( + null, + new FacesMessage( + FacesMessage.SEVERITY_ERROR, + "Username already exists", + null + ) + ); + return null; + } + if (userDAO.emailExists(user.getEmail())) { + FacesContext.getCurrentInstance() + .addMessage( + null, + new FacesMessage( + FacesMessage.SEVERITY_ERROR, + "Email already registered", + null + ) + ); + return null; + } + + String hashedPassword = BCrypt.withDefaults() + .hashToString(12, user.getPassword().toCharArray()); + user.setPassword(hashedPassword); + userDAO.saveUser(user); + + FacesContext.getCurrentInstance() + .addMessage( + null, + new FacesMessage( + FacesMessage.SEVERITY_INFO, + "Registration successful. Please log in.", + null + ) + ); + return "login?faces-redirect=true"; + } + + public String logout() { + FacesContext.getCurrentInstance() + .getExternalContext() + .invalidateSession(); + return "login?faces-redirect=true"; + } + + // Getter und Setter + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public String getConfirmPassword() { + return confirmPassword; + } + + public void setConfirmPassword(String confirmPassword) { + this.confirmPassword = confirmPassword; + } +} diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/TodoBean.java b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/TodoBean.java new file mode 100644 index 0000000..5b9302d --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/TodoBean.java @@ -0,0 +1,112 @@ +package com.todoapp.bean; + +import com.todoapp.dao.TodoDAO; +import com.todoapp.model.Todo; +import com.todoapp.model.User; +import jakarta.enterprise.context.SessionScoped; +import jakarta.faces.context.FacesContext; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import java.io.Serializable; +import java.util.List; + +@Named +@SessionScoped +public class TodoBean implements Serializable { + + @Inject + private TodoDAO todoDAO; + + private Todo todo = new Todo(); + private List todos; + + public String saveOrUpdateTodo() { + if (todo.getId() == null) { + return saveTodo(); + } else { + return updateTodo(); + } + } + + public List getTodosByUser(Long userId) { + if (todos == null) { + todos = todoDAO.getTodosByUser(userId); + } + return todos; + } + + public List getTodosByUser() { + User user = (User) FacesContext.getCurrentInstance() + .getExternalContext() + .getSessionMap() + .get("user"); + System.out.println("Fetching todos for user ID: " + user.getId()); + List todos = todoDAO.getTodosByUser(user.getId()); + System.out.println("Fetched todos: " + todos); + return todos; + } + + public void loadTodo() { + String idParam = FacesContext.getCurrentInstance() + .getExternalContext() + .getRequestParameterMap() + .get("id"); + if (idParam != null && !idParam.isEmpty()) { + Long id = Long.parseLong(idParam); + todo = todoDAO.getTodoById(id); + } else { + todo = new Todo(); + } + } + + public String saveTodo(User user) { + todo.setUser(user); + todoDAO.saveTodo(todo); + todo = new Todo(); + todos = null; + return "todo-list?faces-redirect=true"; + } + + public String saveTodo() { + User user = (User) FacesContext.getCurrentInstance() + .getExternalContext() + .getSessionMap() + .get("user"); + System.out.println(user); + todo.setUser(user); + todoDAO.saveTodo(todo); + todo = new Todo(); + todos = null; + return "todo-list?faces-redirect=true"; + } + + public String updateTodo() { + todoDAO.updateTodo(todo); + todo = new Todo(); + todos = null; + return "todo-list?faces-redirect=true"; + } + + public String deleteTodo(Long id) { + todoDAO.deleteTodo(id); + todos = null; + return "todo-list?faces-redirect=true"; + } + + public String completeTodo(Long id) { + Todo todoToComplete = todoDAO.getTodoById(id); + todoToComplete.setCompleted(!todoToComplete.isCompleted()); + todoDAO.updateTodo(todoToComplete); + todos = null; + return "todo-list?faces-redirect=true"; + } + + // Getter und Setter für 'todo' + public Todo getTodo() { + return todo; + } + + public void setTodo(Todo todo) { + this.todo = todo; + } +} diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/UserBean.java b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/UserBean.java new file mode 100644 index 0000000..0d21d99 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/UserBean.java @@ -0,0 +1,43 @@ +package com.todoapp.bean; + +import com.todoapp.dao.UserDAO; +import com.todoapp.model.User; +import jakarta.enterprise.context.SessionScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import java.io.Serializable; +import java.util.List; + +@Named +@SessionScoped +public class UserBean implements Serializable { + + @Inject + private UserDAO userDAO; + + private User user = new User(); + private List users; + + public List getAllUsers() { + if (users == null) { + users = userDAO.getAllUsers(); + } + return users; + } + + public String saveUser() { + userDAO.saveUser(user); + user = new User(); + users = null; // Reset the list to force a refresh + return "user-list?faces-redirect=true"; + } + + // Getter und Setter für 'user' + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/dao/TodoDAO.java b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/dao/TodoDAO.java new file mode 100644 index 0000000..91ebf81 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/dao/TodoDAO.java @@ -0,0 +1,134 @@ +package com.todoapp.dao; + +import com.todoapp.model.Todo; +import com.todoapp.util.HibernateUtil; +import jakarta.enterprise.context.ApplicationScoped; +import java.util.List; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +@ApplicationScoped +public class TodoDAO { + + public void saveTodo(Todo todo) { + Transaction transaction = null; + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + transaction = session.beginTransaction(); + session.persist(todo); + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public void updateTodo(Todo todo) { + Transaction transaction = null; + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + transaction = session.beginTransaction(); + session.merge(todo); + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public void deleteTodo(Long id) { + Transaction transaction = null; + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + transaction = session.beginTransaction(); + Todo todo = session.get(Todo.class, id); + if (todo != null) { + session.remove(todo); + } + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public Todo getTodoById(Long id) { + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + return session.get(Todo.class, id); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public List getAllTodos() { + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + return session.createQuery("FROM Todo", Todo.class).list(); + } catch (Exception e) { + e.printStackTrace(); + return List.of(); + } + } + + public List getTodosByUser(Long userId) { + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + Query query = session.createQuery( + "FROM Todo t WHERE t.user.id = :userId ORDER BY t.completed, t.targetDate", + Todo.class + ); + query.setParameter("userId", userId); + return query.list(); + } catch (Exception e) { + e.printStackTrace(); + return List.of(); + } + } + + public List getCompletedTodosByUser(Long userId) { + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + Query query = session.createQuery( + "FROM Todo t WHERE t.user.id = :userId AND t.completed = true", + Todo.class + ); + query.setParameter("userId", userId); + return query.list(); + } catch (Exception e) { + e.printStackTrace(); + return List.of(); + } + } + + public List getIncompleteTodosByUser(Long userId) { + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + Query query = session.createQuery( + "FROM Todo t WHERE t.user.id = :userId AND t.completed = false ORDER BY t.targetDate", + Todo.class + ); + query.setParameter("userId", userId); + return query.list(); + } catch (Exception e) { + e.printStackTrace(); + return List.of(); + } + } +} diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/dao/UserDAO.java b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/dao/UserDAO.java new file mode 100644 index 0000000..435da9e --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/dao/UserDAO.java @@ -0,0 +1,136 @@ +package com.todoapp.dao; + +import com.todoapp.model.User; +import com.todoapp.util.HibernateUtil; +import jakarta.enterprise.context.ApplicationScoped; +import java.util.List; +import java.util.Optional; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +@ApplicationScoped +public class UserDAO { + + public void saveUser(User user) { + Transaction transaction = null; + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + transaction = session.beginTransaction(); + session.persist(user); + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public void updateUser(User user) { + Transaction transaction = null; + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + transaction = session.beginTransaction(); + session.merge(user); + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public void deleteUser(Long id) { + Transaction transaction = null; + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + transaction = session.beginTransaction(); + User user = session.get(User.class, id); + if (user != null) { + session.remove(user); + } + transaction.commit(); + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + } + } + + public User getUserById(Long id) { + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + return session.get(User.class, id); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public Optional getUserByUsername(String username) { + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + Query query = session.createQuery( + "FROM User WHERE username = :username", + User.class + ); + query.setParameter("username", username); + User user = query.uniqueResult(); + return Optional.ofNullable(user); + } catch (Exception e) { + e.printStackTrace(); + return Optional.empty(); + } + } + + public List getAllUsers() { + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + return session.createQuery("FROM User", User.class).list(); + } catch (Exception e) { + e.printStackTrace(); + return List.of(); + } + } + + public boolean usernameExists(String username) { + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + Query query = session.createQuery( + "SELECT COUNT(u) FROM User u WHERE u.username = :username", + Long.class + ); + query.setParameter("username", username); + return query.uniqueResult() > 0; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean emailExists(String email) { + try ( + Session session = HibernateUtil.getSessionFactory().openSession() + ) { + Query query = session.createQuery( + "SELECT COUNT(u) FROM User u WHERE u.email = :email", + Long.class + ); + query.setParameter("email", email); + return query.uniqueResult() > 0; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } +} diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/model/Todo.java b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/model/Todo.java new file mode 100644 index 0000000..88fd60b --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/model/Todo.java @@ -0,0 +1,110 @@ +package com.todoapp.model; + +import jakarta.persistence.*; +import java.io.Serializable; +import java.time.LocalDate; + +@Entity +@Table(name = "todos") +public class Todo implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @Column(length = 1000) + private String description; + + @Column(name = "target_date") + private LocalDate targetDate; + + private boolean completed; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + // Konstruktoren + public Todo() {} + + public Todo( + String title, + String description, + LocalDate targetDate, + boolean completed + ) { + this.title = title; + this.description = description; + this.targetDate = targetDate; + this.completed = completed; + } + + // Getter und Setter + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public LocalDate getTargetDate() { + return targetDate; + } + + public void setTargetDate(LocalDate targetDate) { + this.targetDate = targetDate; + } + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + @Override + public String toString() { + return ( + "Todo{" + + "id=" + + id + + ", title='" + + title + + '\'' + + ", targetDate=" + + targetDate + + ", completed=" + + completed + + '}' + ); + } +} diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/model/User.java b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/model/User.java new file mode 100644 index 0000000..3938f64 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/model/User.java @@ -0,0 +1,98 @@ +package com.todoapp.model; + +import jakarta.persistence.*; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "users") +public class User implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, unique = true) + private String username; + + @Column(nullable = false) + private String password; + + @Column(nullable = false) + private String email; + + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) + private List todos = new ArrayList<>(); + + // Konstruktoren + public User() { + } + + public User(String username, String password, String email) { + this.username = username; + this.password = password; + this.email = email; + } + + // Getter und Setter + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public List getTodos() { + return todos; + } + + public void setTodos(List todos) { + this.todos = todos; + } + + // Hilfsmethoden + public void addTodo(Todo todo) { + todos.add(todo); + todo.setUser(this); + } + + public void removeTodo(Todo todo) { + todos.remove(todo); + todo.setUser(null); + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", username='" + username + '\'' + + ", email='" + email + '\'' + + '}'; + } +} diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/util/AuthFilter.java b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/util/AuthFilter.java new file mode 100644 index 0000000..49b8cb3 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/util/AuthFilter.java @@ -0,0 +1,44 @@ +package com.todoapp.util; + +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(urlPatterns = { "/todos/*", "/users/*" }) +public class AuthFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + // Initialisierung + } + + @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); + + boolean isLoggedIn = (session != null && session.getAttribute("userId") != null); + boolean isLoginRequest = httpRequest.getRequestURI().contains("/auth/login"); + boolean isRegisterRequest = httpRequest.getRequestURI().contains("/auth/register"); + boolean isResourceRequest = httpRequest.getRequestURI().contains("/css/") || + httpRequest.getRequestURI().contains("/js/"); + + if (isLoggedIn || isLoginRequest || isRegisterRequest || isResourceRequest) { + chain.doFilter(request, response); + } else { + httpResponse.sendRedirect(httpRequest.getContextPath() + "/auth/login"); + } + } + + @Override + public void destroy() { + // Aufräumen + } +} diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/util/HibernateUtil.java b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/util/HibernateUtil.java new file mode 100644 index 0000000..e868bc6 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/util/HibernateUtil.java @@ -0,0 +1,109 @@ +//package com.todoapp.util; +// +//import org.hibernate.SessionFactory; +//import org.hibernate.boot.Metadata; +//import org.hibernate.boot.MetadataSources; +//import org.hibernate.boot.registry.StandardServiceRegistry; +//import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +//import org.hibernate.cfg.Configuration; +// +//public class HibernateUtil { +// private static StandardServiceRegistry registry; +// private static SessionFactory sessionFactory; +// +// public static SessionFactory getSessionFactory() { +// if (sessionFactory == null) { +// try { +// // Create registry +// registry = new StandardServiceRegistryBuilder() +// .configure() +// .build(); +// +// // Create MetadataSources +// MetadataSources sources = new MetadataSources(registry); +// +// // Create Metadata +// Metadata metadata = sources.getMetadataBuilder().build(); +// +// // Create SessionFactory +// sessionFactory = metadata.getSessionFactoryBuilder().build(); +// +// } catch (Exception e) { +// e.printStackTrace(); +// if (registry != null) { +// StandardServiceRegistryBuilder.destroy(registry); +// } +// } +// } +// return sessionFactory; +// } +// +// public static void shutdown() { +// if (registry != null) { +// StandardServiceRegistryBuilder.destroy(registry); +// } +// } +//} + +package com.todoapp.util; + +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.sql.DataSource; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + try { + Configuration configuration = new Configuration(); + configuration.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver"); + configuration.setProperty("hibernate.connection.url", "jdbc:postgresql://postgresdb:5432/todo_db"); + configuration.setProperty("hibernate.connection.username", "postgres"); + configuration.setProperty("hibernate.connection.password", "postgres"); + + // Entity-Klassen registrieren + configuration.addAnnotatedClass(com.todoapp.model.User.class); + configuration.addAnnotatedClass(com.todoapp.model.Todo.class); + sessionFactory = configuration.buildSessionFactory(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return sessionFactory; + } + + // public static SessionFactory getSessionFactory() { + // if (sessionFactory == null) { + // try { + // // Create Configuration + // Configuration configuration = new Configuration(); + // + // // Set JNDI DataSource + // Context ctx = new InitialContext(); + // DataSource ds = (DataSource) ctx.lookup("jdbc/PostgresDataSource"); + // configuration.setProperty("hibernate.connection.datasource", + // "jdbc/PostgresDataSource"); + // + // //// Load hibernate.cfg.xml + // // configuration.configure("hibernate.cfg.xml"); + // + // // Build SessionFactory + // sessionFactory = configuration.buildSessionFactory(); + // + // } catch (Exception e) { + // e.printStackTrace(); + // } + // } + // return sessionFactory; + // } + + public static void shutdown() { + if (sessionFactory != null) { + sessionFactory.close(); + } + } +} diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/liberty/config/server.xml b/cmd/jws/projects/jakarta-faces-todo/src/main/liberty/config/server.xml new file mode 100644 index 0000000..39dda78 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/liberty/config/server.xml @@ -0,0 +1,34 @@ + + + + + servlet-6.0 + pages-3.1 + jdbc-4.2 + jndi-1.0 + monitor-1.0 + faces-4.0 + websocket-2.1 + + + + + + + + + + + + + + + + + diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/resources/META-INF/persistence.xml b/cmd/jws/projects/jakarta-faces-todo/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..1e6b316 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,20 @@ + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.todoapp.model.User + com.todoapp.model.Todo + + + + + + + + + + + diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/resources/hibernate.cfg.xml b/cmd/jws/projects/jakarta-faces-todo/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000..33bdd20 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,26 @@ + + + + + + jdbc/PostgresDataSource + + + org.hibernate.dialect.PostgreSQLDialect + + + true + + + thread + + + update + + + + + + diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/WEB-INF/faces-config.xml b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 0000000..49adde1 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,7 @@ + + + diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/WEB-INF/web.xml b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..687074e --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,43 @@ + + + + Todo Application + + + login.xhtml + + + + Faces Servlet + jakarta.faces.webapp.FacesServlet + 1 + + + + Faces Servlet + *.xhtml + + + + jakarta.faces.PROJECT_STAGE + Development + + + + 404 + /error.xhtml + + + + 500 + /error.xhtml + + + + 30 + + + diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/error.xhtml b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/error.xhtml new file mode 100644 index 0000000..8f9ae9f --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/error.xhtml @@ -0,0 +1,24 @@ + + + + + Fehler + + + +
+

Oops! Es ist ein Fehler aufgetreten

+ +
+

Etwas ist schiefgelaufen. Bitte versuchen Sie es später erneut.

+

Fehlercode: #{facesContext.externalContext.responseStatusCode}

+
+ +
+ +
+
+
+ diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/login.xhtml b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/login.xhtml new file mode 100644 index 0000000..5575a23 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/login.xhtml @@ -0,0 +1,35 @@ + + + + + Login + + + +
+

Login

+ + + + +
+ + +
+ +
+ + +
+ +
+ +
+
+ +

Noch keinen Account?

+
+
+ diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/register.xhtml b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/register.xhtml new file mode 100644 index 0000000..d2acf85 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/register.xhtml @@ -0,0 +1,45 @@ + + + + + Registrierung + + + +
+

Registrierung

+ + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ +

Bereits registriert?

+
+
+ diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/resources/css/style.css b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/resources/css/style.css new file mode 100644 index 0000000..1de9c26 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/resources/css/style.css @@ -0,0 +1,246 @@ +/* Allgemeine Stile */ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: Arial, sans-serif; + line-height: 1.6; + background-color: #f4f4f4; + color: #333; +} + +.container { + max-width: 900px; + margin: 0 auto; + padding: 20px; +} + +h1 { + margin-bottom: 20px; + text-align: center; + color: #333; +} + +/* Header und Navigation */ +header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + padding-bottom: 10px; + border-bottom: 1px solid #ddd; +} + +.user-info { + display: flex; + align-items: center; + gap: 20px; +} + +.logout-btn { + background-color: #f44336; + color: white; + padding: 5px 10px; + border-radius: 4px; + text-decoration: none; +} + +.logout-btn:hover { + background-color: #d32f2f; +} + +/* Formulare */ +.form-group { + margin-bottom: 15px; +} + +.form-group label { + display: block; + margin-bottom: 5px; + font-weight: bold; +} + +.form-group input, +.form-group textarea { + width: 100%; + padding: 8px; + border: 1px solid #ddd; + border-radius: 4px; +} + +.form-group button { + background-color: #4caf50; + color: white; + padding: 10px 15px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; +} + +.form-group button:hover { + background-color: #45a049; +} + +/* Alerts */ +.alert { + padding: 10px; + margin-bottom: 15px; + border-radius: 4px; +} + +.alert-danger { + background-color: #f8d7da; + color: #721c24; + border: 1px solid #f5c6cb; +} + +.alert-success { + background-color: #d4edda; + color: #155724; + border: 1px solid #c3e6cb; +} + +/* Links */ +a { + color: #007bff; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* Buttons */ +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: 400; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + border: 1px solid transparent; + border-radius: 4px; + text-decoration: none; +} + +.btn:hover { + text-decoration: none; +} + +.add-btn { + background-color: #4caf50; + color: white; +} + +.add-btn:hover { + background-color: #45a049; +} + +.edit-btn { + background-color: #2196f3; + color: white; +} + +.edit-btn:hover { + background-color: #0b7dda; +} + +.delete-btn { + background-color: #f44336; + color: white; +} + +.delete-btn:hover { + background-color: #d32f2f; +} + +.complete-btn { + background-color: #ff9800; + color: white; +} + +.complete-btn:hover { + background-color: #e68a00; +} + +.cancel-btn { + background-color: #9e9e9e; + color: white; +} + +.cancel-btn:hover { + background-color: #7e7e7e; +} + +.save-btn { + background-color: #4caf50; + color: white; +} + +.save-btn:hover { + background-color: #45a049; +} + +/* Todo-Liste */ +.todo-actions { + margin-bottom: 20px; + text-align: right; +} + +.todo-table { + width: 100%; + border-collapse: collapse; + margin-bottom: 20px; +} + +.todo-table th, +.todo-table td { + padding: 10px; + text-align: left; + border-bottom: 1px solid #ddd; +} + +.todo-table th { + background-color: #f2f2f2; +} + +.todo-table tr:hover { + background-color: #f5f5f5; +} + +.todo-table tr.completed { + background-color: #f0f0f0; + color: #666; +} + +.status { + padding: 3px 8px; + border-radius: 12px; + font-size: 12px; +} + +.status.completed { + background-color: #4caf50; + color: white; +} + +.status.pending { + background-color: #ff9800; + color: white; +} + +.no-todos { + text-align: center; + padding: 20px; + background-color: #f9f9f9; + border-radius: 4px; + margin-top: 20px; +} diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/todo-form.xhtml b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/todo-form.xhtml new file mode 100644 index 0000000..929a611 --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/todo-form.xhtml @@ -0,0 +1,46 @@ + + + + + + + + #{todoBean.todo.id == null ? 'Neue Aufgabe' : 'Aufgabe bearbeiten'} + + + +
+

#{todoBean.todo.id == null ? 'Neue Aufgabe' : 'Aufgabe bearbeiten'}

+ + + + +
+ + +
+ +
+ + +
+ +
+ + + + +
+ +
+ + +
+
+
+
+ diff --git a/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/todo-list.xhtml b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/todo-list.xhtml new file mode 100644 index 0000000..109325f --- /dev/null +++ b/cmd/jws/projects/jakarta-faces-todo/src/main/webapp/todo-list.xhtml @@ -0,0 +1,70 @@ + + + + + Meine Aufgaben + + + +
+
+

Meine Aufgaben

+ +
+ +
+ +
+ + +
+

Keine Aufgaben vorhanden. Erstellen Sie eine neue Aufgabe!

+
+
+ + + + Titel + #{todo.title} + + + Beschreibung + #{todo.description} + + + Fälligkeitsdatum + + + + + + Status + + + + + Aktionen + + + + + + + + + +
+
+ diff --git a/cmd/jws/projects/jakarta-servlet-todo/.devcontainer/Dockerfile b/cmd/jws/projects/jakarta-servlet-todo/.devcontainer/Dockerfile deleted file mode 100644 index 88ce4c6..0000000 --- a/cmd/jws/projects/jakarta-servlet-todo/.devcontainer/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM mcr.microsoft.com/devcontainers/java:1-21-bullseye - -ARG INSTALL_MAVEN="false" -ARG MAVEN_VERSION="" - -ARG INSTALL_GRADLE="false" -ARG GRADLE_VERSION="" - -RUN apt-get update && apt-get upgrade -y && \ - apt-get install -y \ - git - -RUN if [ "${INSTALL_MAVEN}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/sdkman/bin/sdkman-init.sh && sdk install maven \"${MAVEN_VERSION}\""; fi \ - && if [ "${INSTALL_GRADLE}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/sdkman/bin/sdkman-init.sh && sdk install gradle \"${GRADLE_VERSION}\""; fi - -RUN mkdir -p /workspaces/${localWorkspaceFolderBasename} && chown -R vscode:vscode /workspaces/${localWorkspaceFolderBasename} - -ENTRYPOINT ["/bin/bash"] diff --git a/cmd/jws/projects/jakarta-servlet-todo/.devcontainer/devcontainer.json b/cmd/jws/projects/jakarta-servlet-todo/.devcontainer/devcontainer.json deleted file mode 100644 index 3fc9403..0000000 --- a/cmd/jws/projects/jakarta-servlet-todo/.devcontainer/devcontainer.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "Jakarta EE Todo App & PostgreSQL", - "dockerComposeFile": "docker-compose.yml", - "service": "app", - "workspaceFolder": "/workspaces", - "extensions": ["vscjava.vscode-java-pack", "redhat.vscode-xml"], - "forwardPorts": [9080], - "remoteUser": "vscode" -} diff --git a/cmd/jws/projects/jakarta-servlet-todo/.devcontainer/docker-compose.yml b/cmd/jws/projects/jakarta-servlet-todo/.devcontainer/docker-compose.yml deleted file mode 100644 index 96374b2..0000000 --- a/cmd/jws/projects/jakarta-servlet-todo/.devcontainer/docker-compose.yml +++ /dev/null @@ -1,32 +0,0 @@ -version: "3.8" - -volumes: - postgres-data: - -services: - app: - container_name: javadev - build: - context: . - dockerfile: Dockerfile - environment: - POSTGRES_PASSWORD: postgres - POSTGRES_USER: postgres - POSTGRES_DB: postgres - POSTGRES_HOSTNAME: postgresdb - volumes: - - ..:/workspace - command: sleep infinity - network_mode: service:db - stdin_open: true - - db: - container_name: postgresdb - image: postgres:latest - restart: unless-stopped - volumes: - - postgres-data:/var/lib/postgresql/data - environment: - POSTGRES_PASSWORD: postgres - POSTGRES_USER: postgres - POSTGRES_DB: postgres diff --git a/cmd/jws/projects/jakarta-servlet-todo/pom.xml b/cmd/jws/projects/jakarta-servlet-todo/pom.xml deleted file mode 100644 index f4e6fc5..0000000 --- a/cmd/jws/projects/jakarta-servlet-todo/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - 4.0.0 - - com.example - jakarta-servlet-todo - 1.0-SNAPSHOT - war - - - 11 - 11 - 10.0.0 - 6.0.0.Final - 42.3.1 - - - - - jakarta.platform - jakarta.jakartaee-api - ${jakartaee.version} - provided - - - org.hibernate.orm - hibernate-core - ${hibernate.version} - - - org.postgresql - postgresql - ${postgresql.version} - - - - - ${project.artifactId} - - - org.apache.maven.plugins - maven-war-plugin - 3.3.2 - - - - - diff --git a/cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/dao/TodoDAO.java b/cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/dao/TodoDAO.java deleted file mode 100644 index 1006346..0000000 --- a/cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/dao/TodoDAO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.example.dao; - -import com.example.model.Todo; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import jakarta.transaction.Transactional; - -import java.util.List; - -public class TodoDAO { - - @PersistenceContext - private EntityManager em; - - @Transactional - public void create(Todo todo) { - em.persist(todo); - } - - public List findAll() { - return em.createQuery("SELECT t FROM Todo t", Todo.class).getResultList(); - } - - @Transactional - public void update(Todo todo) { - em.merge(todo); - } - - @Transactional - public void delete(Long id) { - Todo todo = em.find(Todo.class, id); - if (todo != null) { - em.remove(todo); - } - } -} diff --git a/cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/model/Todo.java b/cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/model/Todo.java deleted file mode 100644 index 49572c3..0000000 --- a/cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/model/Todo.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.example.model; - -import jakarta.persistence.*; - -@Entity -@Table(name = "todos") -public class Todo { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String title; - - @Column(nullable = false) - private boolean completed; - - // Getter und Setter - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public boolean isCompleted() { - return completed; - } - - public void setCompleted(boolean completed) { - this.completed = completed; - } -} diff --git a/cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/servlet/TodoServlet.java b/cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/servlet/TodoServlet.java deleted file mode 100644 index ae8b325..0000000 --- a/cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/servlet/TodoServlet.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.example.servlet; - -import com.example.dao.TodoDAO; -import com.example.model.Todo; -import jakarta.inject.Inject; -import jakarta.servlet.ServletException; -import jakarta.servlet.annotation.WebServlet; -import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -import java.io.IOException; -import java.util.List; - -@WebServlet("/todos") -public class TodoServlet extends HttpServlet { - - @Inject - private TodoDAO todoDAO; - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - List todos = todoDAO.findAll(); - req.setAttribute("todos", todos); - req.getRequestDispatcher("/index.jsp").forward(req, resp); - } - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - String title = req.getParameter("title"); - boolean completed = "on".equals(req.getParameter("completed")); - - Todo todo = new Todo(); - todo.setTitle(title); - todo.setCompleted(completed); - - todoDAO.create(todo); - resp.sendRedirect(req.getContextPath() + "/todos"); - } -} diff --git a/cmd/jws/projects/jakarta-servlet-todo/src/main/resources/META-INF/persistence.xml b/cmd/jws/projects/jakarta-servlet-todo/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index 3e553ee..0000000 --- a/cmd/jws/projects/jakarta-servlet-todo/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - com.example.model.Todo - - - - - - - - - - - - diff --git a/cmd/jws/projects/jakarta-servlet-todo/src/main/webapp/WEB-INF/web.xml b/cmd/jws/projects/jakarta-servlet-todo/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 1a8fbb4..0000000 --- a/cmd/jws/projects/jakarta-servlet-todo/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - JakartaEE Todo App - - - diff --git a/cmd/jws/projects/jakarta-servlet-todo/src/main/webapp/index.jsp b/cmd/jws/projects/jakarta-servlet-todo/src/main/webapp/index.jsp deleted file mode 100644 index 2824734..0000000 --- a/cmd/jws/projects/jakarta-servlet-todo/src/main/webapp/index.jsp +++ /dev/null @@ -1,36 +0,0 @@ -<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> - - - - Todo App - - -

Todo App

- -
- - - - - - - -
- -

Todos

-
    -<% - List todos = (List) request.getAttribute("todos"); - if (todos != null) { - for (com.example.model.Todo todo : todos) { -%> -
  • <%= todo.getTitle() %> - <%= todo.isCompleted() ? "Completed" : "Pending" %>
  • -<% - } - } -%> -
- - - - diff --git a/cmd/jws/projects/jakarta-servlet-todo/target/classes/META-INF/persistence.xml b/cmd/jws/projects/jakarta-servlet-todo/target/classes/META-INF/persistence.xml deleted file mode 100644 index e69de29..0000000 diff --git a/cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/dao/TodoDAO.class b/cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/dao/TodoDAO.class deleted file mode 100644 index 769f9fd..0000000 Binary files a/cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/dao/TodoDAO.class and /dev/null differ diff --git a/cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/model/Todo.class b/cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/model/Todo.class deleted file mode 100644 index 84a12ac..0000000 Binary files a/cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/model/Todo.class and /dev/null differ diff --git a/cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/servlet/TodoServlet.class b/cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/servlet/TodoServlet.class deleted file mode 100644 index bfe39e7..0000000 Binary files a/cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/servlet/TodoServlet.class and /dev/null differ