From 3072446df07740cf0ca5c871c5e869710cde2ea3 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Thu, 20 Mar 2025 17:53:54 +0100 Subject: [PATCH 01/38] feat: add jakarta-todo-jsp implementation --- FyneApp.toml | 6 + Icon.png | Bin 0 -> 2375 bytes cmd/jws/projects/jakarta-jsp-todo/Dockerfile | 62 +++++ .../jakarta-jsp-todo/docker-compose.yml | 50 ++++ cmd/jws/projects/jakarta-jsp-todo/init.sql | 17 ++ cmd/jws/projects/jakarta-jsp-todo/pom.xml | 89 +++++++ cmd/jws/projects/jakarta-jsp-todo/server.xml | 33 +++ .../main/java/com/todoapp/dao/TodoDAO.java | 111 ++++++++ .../main/java/com/todoapp/dao/UserDAO.java | 112 ++++++++ .../src/main/java/com/todoapp/model/Todo.java | 99 +++++++ .../src/main/java/com/todoapp/model/User.java | 98 +++++++ .../java/com/todoapp/servlet/AuthServlet.java | 154 +++++++++++ .../java/com/todoapp/servlet/TodoServlet.java | 182 +++++++++++++ .../java/com/todoapp/servlet/UserServlet.java | 73 ++++++ .../java/com/todoapp/util/AuthFilter.java | 44 ++++ .../java/com/todoapp/util/HibernateUtil.java | 109 ++++++++ .../src/main/liberty/config/server.xml | 34 +++ .../main/resources/META-INF/persistence.xml | 20 ++ .../src/main/resources/hibernate.cfg.xml | 26 ++ .../src/main/webapp/WEB-INF/web.xml | 27 ++ .../src/main/webapp/css/style.css | 246 ++++++++++++++++++ .../src/main/webapp/error.jsp | 23 ++ .../src/main/webapp/login.jsp | 45 ++++ .../src/main/webapp/register.jsp | 49 ++++ .../src/main/webapp/todo-form.jsp | 41 +++ .../src/main/webapp/todo-list.jsp | 80 ++++++ 26 files changed, 1830 insertions(+) create mode 100644 FyneApp.toml create mode 100644 Icon.png create mode 100644 cmd/jws/projects/jakarta-jsp-todo/Dockerfile create mode 100644 cmd/jws/projects/jakarta-jsp-todo/docker-compose.yml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/init.sql create mode 100644 cmd/jws/projects/jakarta-jsp-todo/server.xml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/TodoDAO.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/UserDAO.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/Todo.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/User.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/AuthServlet.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/TodoServlet.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/UserServlet.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/AuthFilter.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/HibernateUtil.java create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/liberty/config/server.xml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/resources/META-INF/persistence.xml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/resources/hibernate.cfg.xml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/WEB-INF/web.xml create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/css/style.css create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/error.jsp create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/login.jsp create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/register.jsp create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-form.jsp create mode 100644 cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-list.jsp diff --git a/FyneApp.toml b/FyneApp.toml new file mode 100644 index 0000000..ef1a5d8 --- /dev/null +++ b/FyneApp.toml @@ -0,0 +1,6 @@ +[Default] +Icon = "Icon.png" +Name = "JavaWebStarter" +ID = "com.hegenberg.app" +Version = "0.0.1" +Build = 1 diff --git a/Icon.png b/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c666c8b562ce1ed8dc2a5dcaaded184093088a GIT binary patch literal 2375 zcmZuzdpwkB8@}I}mpNz{6XP^8z9msE6GHor*4 zNG(O0{W=iJOrkqOb9_`R{`NB?CEKvej8tPe@;{=086RBwwRAz|rO{Y~i!tr7qC#pL|dpn^8@ z=E4o9u_J8HOQu0RINzu1NVG2e*_bj#vGs<5Ji1V+bv%n$$2r6O?;IM7 zw*Q3*VRuK0V#m+Tx9{VG?}ga#kv!M9^RCx?4ick6W-60zS2RTP2wdBG#oeCqZM0JK z<{ujj3vT=w!HKue>)}O*-0#k}-R)fWxZJpQIo;ew*8a_#>o*QOi@HbM-13<1r1B}L z4$X?+H{v`ci{JQ!cf;1cN^BZ;ckdH}1@|5GmkS@XRGi5)CKNw&jAab@z8d=dU`NK( zZ-xJC7s;(MKBhEnbsLGESUTO|`_rGxqWfR8s2aLxo&CD{5<$bHQTG*(xnrnCrNXu8 z#oQ*96$>eN)4jh5-O0S9XsT5C^4dLo=B7Ot&)h|Ausf=%D{AtuYC6r-U@QJm9dx=3 zCik{B&N#_QO2!LqaF&zu6jwXP{JqHu?HQ^LuLRt#$qIh(IW9s+R~(2~$whiI7rt{2 zz#0V$E@w~DnEM^1_;u6*s1dcCJ4O@zl`2_!;>$*gv)lwGa-#G%6O`>iYNJ-GUZtM| z|EyMlf|I4Ij2hMrGxfq=ir<*si9{=(pAzq7qS9Up@((o|wj~G3N7mpjbRY%hXxMlN zA@2xPDLKUOp$W0`uGpR|9p*;9@~SQiTOtP84I=Eaz9JEGaOF<$>oxd`_x;NmF5OY+`C%)+mL;1LWK;8h7XY~k*RIy$#amz}m-bt1hQ`WLy2KFl zo`Iw@P%D89gFc|VQA$_3LKs5@ne#SCwbE83%uT~Yiv{2!A`E}^-f_FGspQecZ*`#8 z)#G_Lf;|sCU2VV+gf{ivzxeYa892u2_0!#cWr*+-Ke>Sn5t^l(`Ze{NMHumYEg!(@ zDA>kjqW3@AADwENJc)#9SteZXFVRBUZNN~=(qm}ByU$OF{u*KocW}RfF+W#wD2)P! zw}KG|eUYX_VU`0D3M>SWWSg-*7p8e89|U%*!5ukzPhg3g0a>8}KA>US3EB2a>_k~X z2fot64sE0@+a}WgpiygrTUJ%A(eBBop^$){4P_SkKXawIqhwo z@ro4>KfdUYq-SjXYqtfmMEBlG)l?CmhFOTjw)29Ypwn*6%n z4&Nw#d5#4zSQRmobM{=^hb*ue2HQy4#x_J2+3q}!L;(Cf3kM#Ya*x8NqM%)d_xZ-9 zReykzr@N0~ZX|mveM5Z;(??B@`Dg~2ezpWjU5PnSQ26k)yCr^D$4xt5OK=VavvPdV zn$Rc{S1eihh{Zt2Oo6Q{NX5rpz1om;Ng$$k)^Wh-1or5Q7^N!MbLrS5KA*N zU|7}@&7f$ln?OCv<>u~LI7`$cBqF~KEEI>2f~RtImG3NQA0E0z;$fQkoWrSry{wM0 zK^m*3T8qo^(?SG*M1Fh^uoxjl^c@KI^$xi$Y!GQ0`1$M4f$AG!9ak9 z1vVL)P!d9y6RE~4_Fa&mL{4RYoI5FxZpeE7Z~q|NEscE`9<>t0NOT${N|flqx@V)_ zCNjx^7Hot*Uzm3xEHDViUh)jNH-}nds{G0nf}AAv96=i0NC8-{b@zmQ@AQwlg3+RB z*Iy{8wd_;(bW@?P`plN@iT*d1Y@~f*jF#9#^n&yLCi>j)^+X}0HGi!d%An`#iM*c- z^oD!Y+n9`aFRaA}S}%7&R^9G+S3B`6xw$H)`bfd1?sVsb8I{P5wHLQaL7AP@-oDdi z^xCSP9b3{SE6&$@Zcgv#=3It2<%b)EwWG<|K4j_G)x^1(8C!KMi7QW>d${GP+Eg}j zyyx<9gM3HZrYUzj)_>F&ynnaKY4YjD;jY!=Ktjh d5l*yAg==Q5+oTg*Q}#I_`FaL;)Cfgc{{^bg+hqU% literal 0 HcmV?d00001 diff --git a/cmd/jws/projects/jakarta-jsp-todo/Dockerfile b/cmd/jws/projects/jakarta-jsp-todo/Dockerfile new file mode 100644 index 0000000..8889dbd --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/Dockerfile @@ -0,0 +1,62 @@ +# # Dockerfile für OpenLiberty +# FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi +# COPY --chown=1001:0 /src/main/liberty/config /config +# +# # PostgreSQL JDBC-Treiber laden +# # RUN mkdir -p ./lib && \ +# # curl -o ./lib/postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.6.0.jar +# +# RUN 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 +# +# # # Arbeitsverzeichnis setzen +# # WORKDIR /opt/ol/wlp/usr/servers/defaultServer +# # +# # # Notwendige Dateien kopieren +# # COPY target/todo-app.war ./apps/ +# # # COPY server.xml ./ +# # +# # # PostgreSQL JDBC-Treiber laden +# # RUN mkdir -p ./lib && \ +# # curl -o ./lib/postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.6.0.jar +# # +# # # OpenLiberty starten +# # CMD ["/opt/ol/wlp/bin/server", "run", "defaultServer"] + +# FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi +# +# # COPY --chown=1001:0 /src/main/liberty/config /config +# # +# # COPY --chown=1001:0 /src/main/liberty/config/server.xml /opt/ol/wlp/usr/servers/defaultServer/ +# +# RUN chmod 644 /opt/ol/wlp/usr/servers/defaultServer/server.xml +# +# +# # 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 + +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-jsp-todo/docker-compose.yml b/cmd/jws/projects/jakarta-jsp-todo/docker-compose.yml new file mode 100644 index 0000000..df9af86 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/docker-compose.yml @@ -0,0 +1,50 @@ +version: "3.8" + +services: + postgres: + image: postgres:15 + networks: + - my_network + container_name: postgres_db + restart: always + environment: + POSTGRES_DB: todo_db + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 10 + + openliberty: + build: . + container_name: openliberty_app + networks: + - my_network + restart: always + ports: + - "9080:9080" + - "9443:9443" + depends_on: + - postgres + environment: + - POSTGRES_HOST=postgres + - POSTGRES_PORT=5432 + - POSTGRES_DB=todo_db + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + volumes: + - ./src/main/liberty/config/server.xml:/config/server.xml + # - ./src/main/liberty/config/server.xml:/opt/ol/wlp/usr/servers/defaultServer/server.xml + +volumes: + postgres_data: +networks: + my_network: + driver: bridge diff --git a/cmd/jws/projects/jakarta-jsp-todo/init.sql b/cmd/jws/projects/jakarta-jsp-todo/init.sql new file mode 100644 index 0000000..9d98295 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/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-jsp-todo/pom.xml b/cmd/jws/projects/jakarta-jsp-todo/pom.xml index e69de29..3158166 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/pom.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/pom.xml @@ -0,0 +1,89 @@ + + + 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.servlet.jsp.jstl + jakarta.servlet.jsp.jstl-api + 3.0.0 + + + org.glassfish.web + jakarta.servlet.jsp.jstl + 3.0.1 + + + + 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-jsp-todo/server.xml b/cmd/jws/projects/jakarta-jsp-todo/server.xml new file mode 100644 index 0000000..92a8bd8 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/server.xml @@ -0,0 +1,33 @@ + + + + + servlet-6.0 + pages-3.1 + jdbc-4.2 + jndi-1.0 + monitor-1.0 + + + + + + + + + + + + + + + + + + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/TodoDAO.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/TodoDAO.java new file mode 100644 index 0000000..82c6107 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/TodoDAO.java @@ -0,0 +1,111 @@ +package com.todoapp.dao; + +import com.todoapp.model.Todo; +import com.todoapp.util.HibernateUtil; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +import java.util.List; + +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-jsp-todo/src/main/java/com/todoapp/dao/UserDAO.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/UserDAO.java new file mode 100644 index 0000000..eba60fc --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/dao/UserDAO.java @@ -0,0 +1,112 @@ +package com.todoapp.dao; + +import com.todoapp.model.User; +import com.todoapp.util.HibernateUtil; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +import java.util.List; +import java.util.Optional; + +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-jsp-todo/src/main/java/com/todoapp/model/Todo.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/Todo.java new file mode 100644 index 0000000..a240a0c --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/Todo.java @@ -0,0 +1,99 @@ +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-jsp-todo/src/main/java/com/todoapp/model/User.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/model/User.java new file mode 100644 index 0000000..3938f64 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-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-jsp-todo/src/main/java/com/todoapp/servlet/AuthServlet.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/AuthServlet.java new file mode 100644 index 0000000..ad24e4c --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/AuthServlet.java @@ -0,0 +1,154 @@ +package com.todoapp.servlet; + +import at.favre.lib.crypto.bcrypt.BCrypt; +import com.todoapp.dao.UserDAO; +import com.todoapp.model.User; +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 jakarta.servlet.http.HttpSession; + +import java.io.IOException; +import java.util.Optional; + +@WebServlet("/auth/*") +public class AuthServlet extends HttpServlet { + + private final UserDAO userDAO = new UserDAO(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String action = request.getPathInfo(); + + if (action == null) { + action = ""; + } + + switch (action) { + case "/register": + showRegisterForm(request, response); + break; + case "/logout": + logout(request, response); + break; + default: + showLoginForm(request, response); + break; + } + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String action = request.getPathInfo(); + + if (action == null) { + action = ""; + } + + switch (action) { + case "/register": + registerUser(request, response); + break; + case "/login": + loginUser(request, response); + break; + default: + response.sendRedirect(request.getContextPath() + "/auth/login"); + break; + } + } + + private void showLoginForm(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.getRequestDispatcher("/login.jsp").forward(request, response); + } + + private void showRegisterForm(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.getRequestDispatcher("/register.jsp").forward(request, response); + } + + private void registerUser(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String confirmPassword = request.getParameter("confirmPassword"); + String email = request.getParameter("email"); + + if (username == null || password == null || email == null || username.trim().isEmpty() || password.trim().isEmpty() + || email.trim().isEmpty()) { + request.setAttribute("errorMessage", "Alle Felder müssen ausgefüllt werden"); + request.getRequestDispatcher("/register.jsp").forward(request, response); + return; + } + + if (!password.equals(confirmPassword)) { + request.setAttribute("errorMessage", "Passwörter stimmen nicht überein"); + request.getRequestDispatcher("/register.jsp").forward(request, response); + return; + } + + if (userDAO.usernameExists(username)) { + request.setAttribute("errorMessage", "Benutzername ist bereits vergeben"); + request.getRequestDispatcher("/register.jsp").forward(request, response); + return; + } + + if (userDAO.emailExists(email)) { + request.setAttribute("errorMessage", "E-Mail-Adresse ist bereits registriert"); + request.getRequestDispatcher("/register.jsp").forward(request, response); + return; + } + + // Hash password + String hashedPassword = BCrypt.withDefaults().hashToString(12, password.toCharArray()); + + User user = new User(username, hashedPassword, email); + userDAO.saveUser(user); + + request.setAttribute("successMessage", "Registrierung erfolgreich. Bitte melden Sie sich an."); + request.getRequestDispatcher("/login.jsp").forward(request, response); + } + + private void loginUser(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + + if (username == null || password == null || username.trim().isEmpty() || password.trim().isEmpty()) { + request.setAttribute("errorMessage", "Benutzername und Passwort sind erforderlich"); + request.getRequestDispatcher("/login.jsp").forward(request, response); + return; + } + + Optional optionalUser = userDAO.getUserByUsername(username); + + if (optionalUser.isPresent()) { + User user = optionalUser.get(); + BCrypt.Result result = BCrypt.verifyer().verify(password.toCharArray(), user.getPassword()); + + if (result.verified) { + HttpSession session = request.getSession(); + session.setAttribute("user", user); + session.setAttribute("userId", user.getId()); + session.setAttribute("username", user.getUsername()); + + response.sendRedirect(request.getContextPath() + "/todos"); + return; + } + } + + request.setAttribute("errorMessage", "Ungültiger Benutzername oder Passwort"); + request.getRequestDispatcher("/login.jsp").forward(request, response); + } + + private void logout(HttpServletRequest request, HttpServletResponse response) throws IOException { + HttpSession session = request.getSession(false); + if (session != null) { + session.invalidate(); + } + response.sendRedirect(request.getContextPath() + "/auth/login"); + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/TodoServlet.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/TodoServlet.java new file mode 100644 index 0000000..5426464 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/TodoServlet.java @@ -0,0 +1,182 @@ +package com.todoapp.servlet; + +import com.todoapp.dao.TodoDAO; +import com.todoapp.dao.UserDAO; +import com.todoapp.model.Todo; +import com.todoapp.model.User; +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 jakarta.servlet.http.HttpSession; + +import java.io.IOException; +import java.time.LocalDate; +import java.util.List; + +@WebServlet("/todos/*") +public class TodoServlet extends HttpServlet { + + private final TodoDAO todoDAO = new TodoDAO(); + private final UserDAO userDAO = new UserDAO(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + HttpSession session = request.getSession(false); + if (session == null || session.getAttribute("userId") == null) { + response.sendRedirect(request.getContextPath() + "/auth/login"); + return; + } + + String action = request.getPathInfo(); + + if (action == null) { + action = "/list"; + } + + switch (action) { + case "/new": + showNewForm(request, response); + break; + case "/edit": + showEditForm(request, response); + break; + case "/delete": + deleteTodo(request, response); + break; + case "/complete": + completeTodo(request, response); + break; + default: + listTodos(request, response); + break; + } + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + HttpSession session = request.getSession(false); + if (session == null || session.getAttribute("userId") == null) { + response.sendRedirect(request.getContextPath() + "/auth/login"); + return; + } + + String action = request.getPathInfo(); + + if (action == null) { + action = "/insert"; + } + + switch (action) { + case "/insert": + insertTodo(request, response); + break; + case "/update": + updateTodo(request, response); + break; + default: + response.sendRedirect(request.getContextPath() + "/todos"); + break; + } + } + + private void listTodos(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + List todos = todoDAO.getTodosByUser(userId); + request.setAttribute("todos", todos); + request.getRequestDispatcher("/todo-list.jsp").forward(request, response); + } + + private void showNewForm(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.getRequestDispatcher("/todo-form.jsp").forward(request, response); + } + + private void showEditForm(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + Long todoId = Long.parseLong(request.getParameter("id")); + + Todo todo = todoDAO.getTodoById(todoId); + + if (todo == null || !todo.getUser().getId().equals(userId)) { + response.sendRedirect(request.getContextPath() + "/todos"); + return; + } + + request.setAttribute("todo", todo); + request.getRequestDispatcher("/todo-form.jsp").forward(request, response); + } + + private void insertTodo(HttpServletRequest request, HttpServletResponse response) throws IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + User user = userDAO.getUserById(userId); + + if (user == null) { + response.sendRedirect(request.getContextPath() + "/auth/login"); + return; + } + + String title = request.getParameter("title"); + String description = request.getParameter("description"); + LocalDate targetDate = LocalDate.parse(request.getParameter("targetDate")); + + Todo todo = new Todo(title, description, targetDate, false); + todo.setUser(user); + + todoDAO.saveTodo(todo); + response.sendRedirect(request.getContextPath() + "/todos"); + } + + private void updateTodo(HttpServletRequest request, HttpServletResponse response) throws IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + Long todoId = Long.parseLong(request.getParameter("id")); + + Todo todo = todoDAO.getTodoById(todoId); + + if (todo == null || !todo.getUser().getId().equals(userId)) { + response.sendRedirect(request.getContextPath() + "/todos"); + return; + } + + String title = request.getParameter("title"); + String description = request.getParameter("description"); + LocalDate targetDate = LocalDate.parse(request.getParameter("targetDate")); + + todo.setTitle(title); + todo.setDescription(description); + todo.setTargetDate(targetDate); + + todoDAO.updateTodo(todo); + response.sendRedirect(request.getContextPath() + "/todos"); + } + + private void deleteTodo(HttpServletRequest request, HttpServletResponse response) throws IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + Long todoId = Long.parseLong(request.getParameter("id")); + + Todo todo = todoDAO.getTodoById(todoId); + + if (todo != null && todo.getUser().getId().equals(userId)) { + todoDAO.deleteTodo(todoId); + } + + response.sendRedirect(request.getContextPath() + "/todos"); + } + + private void completeTodo(HttpServletRequest request, HttpServletResponse response) throws IOException { + Long userId = (Long) request.getSession().getAttribute("userId"); + Long todoId = Long.parseLong(request.getParameter("id")); + + Todo todo = todoDAO.getTodoById(todoId); + + if (todo != null && todo.getUser().getId().equals(userId)) { + todo.setCompleted(!todo.isCompleted()); + todoDAO.updateTodo(todo); + } + + response.sendRedirect(request.getContextPath() + "/todos"); + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/UserServlet.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/UserServlet.java new file mode 100644 index 0000000..c7806c4 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/servlet/UserServlet.java @@ -0,0 +1,73 @@ +package com.todoapp.servlet; + +import com.todoapp.dao.UserDAO; +import com.todoapp.model.User; +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; +import java.util.Optional; + +@WebServlet("/users") +public class UserServlet extends HttpServlet { + private final UserDAO userDAO = new UserDAO(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String idParam = request.getParameter("id"); + if (idParam != null) { + Long id = Long.parseLong(idParam); + User user = userDAO.getUserById(id); + request.setAttribute("user", user); + } else { + List users = userDAO.getAllUsers(); + request.setAttribute("users", users); + } + request.getRequestDispatcher("/user-list.jsp").forward(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String email = request.getParameter("email"); + + if (username == null || password == null || email == null || userDAO.usernameExists(username)) { + response.sendRedirect("error.jsp?message=Invalid%20input%20or%20username%20exists"); + return; + } + User user = new User(username, password, email); + userDAO.saveUser(user); + response.sendRedirect("users"); + } + + @Override + protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Long id = Long.parseLong(request.getParameter("id")); + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String email = request.getParameter("email"); + + Optional userOptional = userDAO.getUserByUsername(username); + if (userOptional.isPresent() && !userOptional.get().getId().equals(id)) { + response.sendRedirect("error.jsp?message=Username%20already%20exists"); + return; + } + User user = new User(username, password, email); + user.setId(id); + userDAO.updateUser(user); + response.sendRedirect("users"); + } + + @Override + protected void doDelete(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + Long id = Long.parseLong(request.getParameter("id")); + userDAO.deleteUser(id); + response.sendRedirect("users"); + } +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/AuthFilter.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/AuthFilter.java new file mode 100644 index 0000000..49b8cb3 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-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-jsp-todo/src/main/java/com/todoapp/util/HibernateUtil.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/HibernateUtil.java new file mode 100644 index 0000000..2e5f645 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-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://postgres: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-jsp-todo/src/main/liberty/config/server.xml b/cmd/jws/projects/jakarta-jsp-todo/src/main/liberty/config/server.xml new file mode 100644 index 0000000..f834402 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-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 + + + + + + + + + + + + + + + + + + + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/META-INF/persistence.xml b/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..c69c584 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-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-jsp-todo/src/main/resources/hibernate.cfg.xml b/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000..33bdd20 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-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-jsp-todo/src/main/webapp/WEB-INF/web.xml b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..9fe71a3 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,27 @@ + + + + Todo Application + + + auth/login + + + + 404 + /error.jsp + + + + 500 + /error.jsp + + + + 30 + + + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/css/style.css b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/css/style.css new file mode 100644 index 0000000..1de9c26 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/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-jsp-todo/src/main/webapp/error.jsp b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/error.jsp new file mode 100644 index 0000000..a032cd1 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/error.jsp @@ -0,0 +1,23 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true" %> + + + + + Fehler + + + +
+

Oops! Es ist ein Fehler aufgetreten

+ +
+

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

+

Fehlercode: ${pageContext.errorData.statusCode}

+
+ + +
+ + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/login.jsp b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/login.jsp new file mode 100644 index 0000000..5a5ae08 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/login.jsp @@ -0,0 +1,45 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> + + + + + Login + + + +
+

Login

+ + +
+

${errorMessage}

+
+
+ + +
+

${successMessage}

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

Noch keinen Account? Registrieren

+
+ + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/register.jsp b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/register.jsp new file mode 100644 index 0000000..496fba3 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/register.jsp @@ -0,0 +1,49 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> + + + + + Registrierung + + + +
+

Registrierung

+ + +
+

${errorMessage}

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

Bereits registriert? Anmelden

+
+ + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-form.jsp b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-form.jsp new file mode 100644 index 0000000..86afc63 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-form.jsp @@ -0,0 +1,41 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> + + + + + ${todo != null ? 'Aufgabe bearbeiten' : 'Neue Aufgabe'} + + + +
+

${todo != null ? 'Aufgabe bearbeiten' : 'Neue Aufgabe'}

+ +
+ + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + Abbrechen +
+
+
+ + diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-list.jsp b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-list.jsp new file mode 100644 index 0000000..e0539c0 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/webapp/todo-list.jsp @@ -0,0 +1,80 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> + + + + + Meine Aufgaben + + + +
+
+

Meine Aufgaben

+ +
+ + + + + +
+

Keine Aufgaben vorhanden. Erstellen Sie eine neue Aufgabe!

+
+
+ + + + + + + + + + + + + + + + + + + + + + +
TitelBeschreibungFälligkeitsdatumStatusAktionen
${todo.title}${todo.description}${todo.targetDate} + + + Erledigt + + + Offen + + + + Bearbeiten + Löschen + + + + Als offen markieren + + + Als erledigt markieren + + + +
+
+
+
+ + From 4a3fb2be5897f1036be68deaf8bf68bfca642cf0 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Thu, 20 Mar 2025 19:16:42 +0100 Subject: [PATCH 02/38] fix: reanble window resize to better support multi monitor setups with different resolutions --- cmd/jws/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/jws/main.go b/cmd/jws/main.go index 70e3e06..e3fcdf0 100644 --- a/cmd/jws/main.go +++ b/cmd/jws/main.go @@ -51,7 +51,7 @@ func main() { a := app.New() mainWindow = a.NewWindow("JakartaEE & Spring Boot Starter") mainWindow.Resize(fyne.NewSize(600, 600)) - mainWindow.SetFixedSize(true) + // mainWindow.SetFixedSize(true) // Initialize dependencies dependencies = []dependency.Dependency{ From 26bdcd9a6a7a71c574302d78db7c32077cc2b7b4 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Thu, 20 Mar 2025 19:17:22 +0100 Subject: [PATCH 03/38] fix: disable password dialog on windows --- internal/gui/gui.go | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/internal/gui/gui.go b/internal/gui/gui.go index d286cb9..dabd873 100644 --- a/internal/gui/gui.go +++ b/internal/gui/gui.go @@ -6,6 +6,7 @@ import ( "jws/internal/logger" "jws/internal/project" "log/slog" + "runtime" "fyne.io/fyne/v2" "fyne.io/fyne/v2/data/binding" @@ -33,19 +34,23 @@ func Init(window fyne.Window, deps []dependency.Dependency, projs []project.Proj // ShowPasswordDialog shows a dialog to enter sudo password for installations func ShowPasswordDialog(index int) { - password := binding.NewString() - entry := widget.NewEntryWithData(password) - entry.Password = true + if runtime.GOOS == "linux" || runtime.GOOS == "darwin" { + password := binding.NewString() + entry := widget.NewEntryWithData(password) + entry.Password = true - dialog.NewForm("Sudo Password", "ok", "cancel", - []*widget.FormItem{widget.NewFormItem("password", entry)}, - func(b bool) { - pass, err := password.Get() - if err == nil { - if b { - dependency.InstallDependency(index, pass, dependencies, mainWindow) + dialog.NewForm("Sudo Password", "ok", "cancel", + []*widget.FormItem{widget.NewFormItem("password", entry)}, + func(b bool) { + pass, err := password.Get() + if err == nil { + if b { + dependency.InstallDependency(index, pass, dependencies, mainWindow) + } } - } - }, - mainWindow).Show() + }, + mainWindow).Show() + } else { + dependency.InstallDependency(index, "", dependencies, mainWindow) + } } From c903fa18030f33facb4f388eed57fec087871380 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Thu, 20 Mar 2025 20:16:22 +0100 Subject: [PATCH 04/38] feat: improve usability by including a progressbar while installing packages on windows and mac --- internal/dependency/dependency.go | 494 ++++++++++++++++-------------- internal/gui/dependency_screen.go | 2 +- 2 files changed, 267 insertions(+), 229 deletions(-) diff --git a/internal/dependency/dependency.go b/internal/dependency/dependency.go index cb4bb1d..6853f31 100644 --- a/internal/dependency/dependency.go +++ b/internal/dependency/dependency.go @@ -13,6 +13,7 @@ import ( "strings" "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/widget" "fyne.io/tools" @@ -97,242 +98,279 @@ func InstallDependency(index int, sudoPassword string, dependencies []Dependency switch runtime.GOOS { case "windows": - switch index { - case 0: // VSCode - cmd = tools.CommandInShell("winget", "install", "-e", "--id", - "Microsoft.VisualStudioCode") - case 1: // Docker Desktop - wslCheckCmd := tools.CommandInShell("wsl", "--status") - err := wslCheckCmd.Run() - if err != nil { - wslInstallCmd := tools.CommandInShell("wsl", "--install") - err = wslInstallCmd.Run() - if err != nil { - errMsg := fmt.Errorf("error: installing WSL: %v", err) - dialog.ShowError(errMsg, mainWindow) - log.Error(errMsg.Error()) - return - } - dialog.ShowInformation("WSL wird installiert", "WSL wird installiert. Bitte warten Sie, bis die Installation abgeschlossen ist und starten Sie die Anwendung neu.", mainWindow) - return - } - - cmd = tools.CommandInShell("winget", "install", "-e", "--id", - "Docker.DockerDesktop") + cmd, err = installWindowsDependencies(index, cmd, &mainWindow) + if err != nil { + dialog.ShowError(err, mainWindow) + log.Error(err.Error()) } case "darwin": - brewCheckCmd := tools.CommandInShell("which", "brew") - err := brewCheckCmd.Run() - if err != nil { - brewInstallCmd := tools.CommandInShell("bin/bash", "-c", "\"$(curl -fsSl https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"") - err := brewInstallCmd.Run() - if err != nil { - errMsg := fmt.Errorf("error: installing homebrew falied: %v", err) - dialog.ShowError(errMsg, mainWindow) - log.Error(errMsg.Error()) - } - } - switch index { - case 0: // VSCode - cmd = tools.CommandInShell("brew", "install", "--cask", "visual-studio-code") - case 1: // Docker - cmd = tools.CommandInShell("brew", "install", "docker") - } + cmd, err = installDarwinDependencies(index, cmd, &mainWindow) + dialog.ShowError(err, mainWindow) + log.Error(err.Error()) case "linux": - osInfo, err := osinfo.GetLinuxDistribution() + err = installLinuxDependencies(index, sudoPassword, cmd, dependencies, &mainWindow) if err != nil { log.Error(err.Error()) - dialog.ShowError(fmt.Errorf("error getting OS info: %v", err), mainWindow) - return - } - - var downloadURL, fileName string - switch index { - case 0: // VSCode - switch osInfo.ID { - case "debian", "ubuntu", "linuxmint": - downloadURL = "https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64" - fileName = "vscode.deb" - case "fedora": - downloadURL = "https://code.visualstudio.com/sha/download?build=stable&os=linux-rpm-x64" - fileName = "vscode.rpm" - default: - dialog.ShowInformation("Nicht unterstützt", fmt.Sprintf("Automatische Installation für dieses OS %v nicht verfügbar", osInfo), mainWindow) - return - } - go func() { - progressBar := widget.NewProgressBar() - progressDialog := dialog.NewCustomWithoutButtons("Download in progress", progressBar, mainWindow) - - progressDialog.Show() - - homeDir, _ := os.UserHomeDir() - downloadDir := filepath.Join(homeDir, "Downloads") - filePath := filepath.Join(downloadDir, fileName) - - err := download.WithProgressBar(downloadURL, filePath, progressBar) - progressDialog.Hide() - - if err != nil { - log.Error(err.Error()) - dialog.ShowError(err, mainWindow) - return - } - - var installCmd string - switch osInfo.ID { - case "debian", "ubuntu", "linuxmint": - installCmd = fmt.Sprintf("sudo -S dpkg -i %s", filePath) - case "fedora": - installCmd = fmt.Sprintf("sudo -S dnf install -y %s", filePath) - } - - cmd := exec.Command("sh", "-c", installCmd) - cmd.Stdin = strings.NewReader(sudoPassword + "\n") - - dialog.ShowInformation("Installation gestartet", - "Die Installation von VSCode wurde gestartet.", mainWindow) - - output, err := cmd.CombinedOutput() - if err != nil { - errMsg := fmt.Errorf("installation failed:\n%s", output) - dialog.ShowError(errMsg, mainWindow) - log.Error(errMsg.Error()) - return - } else { - dialog.ShowInformation("Erfolg", "VSCode erfolgreich installiert!", mainWindow) - CheckDependencies(dependencies) - } - }() - case 1: // Docker - go func() { - progressBar := widget.NewProgressBar() - progressDialog := dialog.NewCustomWithoutButtons("Docker Installation läuft...", progressBar, mainWindow) - progressDialog.Show() - - osInfo, err := osinfo.GetLinuxDistribution() - if err != nil { - progressDialog.Hide() - errMsg := fmt.Errorf("error getting os infos: %v", err) - dialog.ShowError(errMsg, mainWindow) - log.Error(errMsg.Error()) - return - } - - var commands []string - var cleanupCommands []string - var totalSteps int - - switch osInfo.ID { - case "ubuntu", "linuxmint", "debian": - // Ubuntu/Debian Commands - distroPath := "ubuntu" - codeName := "$(. /etc/os-release && echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\")" - if osInfo.ID == "debian" { - distroPath = "debian" - codeName = "$(. /etc/os-release && echo \"$VERSION_CODENAME\")" - } - arch := "$(dpkg --print-architecture)" - - commands = []string{ - "apt-get update", - "apt-get install -y wget", - fmt.Sprintf("wget -qO- https://download.docker.com/linux/%s/dists/%s/pool/stable/%s/ | grep -oP 'href=\"\\K[^\"]*(?=.*deb)' | xargs -I{} wget https://download.docker.com/linux/%s/dists/%s/pool/stable/%s/{}", - distroPath, codeName, arch, distroPath, codeName, arch), - "dpkg -i ./containerd.io*.deb docker-ce*.deb docker-ce-cli*.deb docker-buildx-plugin*.deb docker-compose-plugin*.deb", - "apt-get install -f -y", - "service docker start", - } - - cleanupCommands = []string{ - "rm -rf ./containerd.io*.deb ./docker-ce*.deb ./docker-ce-cli*.deb ./docker-buildx-plugin*.deb ./docker-compose-plugin*.deb", - "apt-get autoremove -y", - "apt-get clean", - } - - totalSteps = len(commands) + len(cleanupCommands) - - case "fedora": - // Fedora Commands - fedoraVer := "$(rpm -E %fedora)" - commands = []string{ - "dnf install -y wget", - fmt.Sprintf("wget https://download.docker.com/linux/fedora/%s/x86_64/stable/Packages/containerd-*.rpm docker-*.rpm docker-ce-*.rpm", fedoraVer), - "dnf install -y ./*.rpm", - "systemctl enable --now docker", - } - - cleanupCommands = []string{ - "rm -rf ./containerd-*.rpm ./docker-*.rpm ./docker-ce-*.rpm", - "dnf autoremove -y", - "dnf clean all", - } - - totalSteps = len(commands) + len(cleanupCommands) - - default: - progressDialog.Hide() - dialog.ShowInformation("not supported", "Automatic Docker installation not supported for your OS.", mainWindow) - return - } - - progressStep := 1.0 / float64(totalSteps) - currentProgress := 0.0 - - for _, cmd := range commands { - command := exec.Command("sudo", "-S", "sh", "-c", cmd) - command.Stdin = strings.NewReader(sudoPassword + "\n") - - if output, err := command.CombinedOutput(); err != nil { - progressDialog.Hide() - errMsg := fmt.Errorf("error at %s:\n%s", cmd, output) - dialog.ShowError(errMsg, mainWindow) - log.Error(errMsg.Error()) - return - } - - currentProgress += progressStep - progressBar.SetValue(currentProgress) - } - - for _, cmd := range cleanupCommands { - command := exec.Command("sudo", "-S", "sh", "-c", cmd) - command.Stdin = strings.NewReader(sudoPassword + "\n") - - if output, err := command.CombinedOutput(); err != nil { - progressDialog.Hide() - errMsg := fmt.Errorf("cleanup error at %s:\n%s", cmd, output) - dialog.ShowError(errMsg, mainWindow) - log.Error(errMsg.Error()) - return - } - - currentProgress += progressStep - progressBar.SetValue(currentProgress) - } - - progressDialog.Hide() - - dialog.ShowInformation( - "Installation finished", - "Docker was succesfully installed! Please re-start your system to let the changes take effect.", - mainWindow, - ) - - CheckDependencies(dependencies) - }() + dialog.ShowError(err, mainWindow) } } if cmd != nil { - err = cmd.Start() - if err != nil { - errMsg := fmt.Errorf("error starting installation process: %v", err) - dialog.ShowError(errMsg, mainWindow) - log.Error(errMsg.Error()) - } else { - dialog.ShowInformation("Installation started", - fmt.Sprintf("Installation of %s was started", depName), mainWindow) - } + showInstallProgressBar(mainWindow, fmt.Sprintf("installing %v", depName), cmd, depName, dependencies) } } + +func installWindowsDependencies(index int, cmd *exec.Cmd, mainWindow *fyne.Window) (*exec.Cmd, error) { + switch index { + case 0: // VSCode + cmd = tools.CommandInShell("winget", "install", "-e", "--id", + "Microsoft.VisualStudioCode") + case 1: // Docker Desktop + wslCheckCmd := tools.CommandInShell("wsl", "--status") + err := wslCheckCmd.Run() + if err != nil { + wslInstallCmd := tools.CommandInShell("wsl", "--install", "ubuntu") + dialog.ShowInformation("WSL wird installiert", "WSL wird installiert. Bitte warten Sie, bis die Installation abgeschlossen ist und starten Sie die Anwendung neu.", *mainWindow) + err = wslInstallCmd.Run() + if err != nil { + errMsg := fmt.Errorf("error: installing WSL: %v", err) + return nil, errMsg + } + return nil, err + } + + cmd = tools.CommandInShell("winget", "install", "-e", "--id", + "Docker.DockerDesktop") + } + return cmd, nil +} + +func installDarwinDependencies(index int, cmd *exec.Cmd, mainWindow *fyne.Window) (*exec.Cmd, error) { + brewCheckCmd := tools.CommandInShell("which", "brew") + err := brewCheckCmd.Run() + if err != nil { + brewInstallCmd := tools.CommandInShell("bin/bash", "-c", "\"$(curl -fsSl https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"") + err := brewInstallCmd.Run() + if err != nil { + errMsg := fmt.Errorf("error: installing homebrew falied: %v", err) + return nil, errMsg + } + } + switch index { + case 0: // VSCode + cmd = tools.CommandInShell("brew", "install", "--cask", "visual-studio-code") + case 1: // Docker + cmd = tools.CommandInShell("brew", "install", "docker") + } + return cmd, nil +} + +func installLinuxDependencies(index int, sudoPassword string, cmd *exec.Cmd, dependencies []Dependency, mainWindow *fyne.Window) error { + osInfo, err := osinfo.GetLinuxDistribution() + if err != nil { + errMsg := fmt.Errorf("error getting OS info: %v", err) + return errMsg + } + + var downloadURL, fileName string + switch index { + case 0: // VSCode + switch osInfo.ID { + case "debian", "ubuntu", "linuxmint": + downloadURL = "https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64" + fileName = "vscode.deb" + case "fedora": + downloadURL = "https://code.visualstudio.com/sha/download?build=stable&os=linux-rpm-x64" + fileName = "vscode.rpm" + default: + dialog.ShowInformation("Nicht unterstützt", fmt.Sprintf("Automatische Installation für dieses OS %v nicht verfügbar", osInfo), *mainWindow) + return nil + } + go func() { + progressBar := widget.NewProgressBar() + progressDialog := dialog.NewCustomWithoutButtons("Download in progress", progressBar, *mainWindow) + + progressDialog.Show() + + homeDir, _ := os.UserHomeDir() + downloadDir := filepath.Join(homeDir, "Downloads") + filePath := filepath.Join(downloadDir, fileName) + + err := download.WithProgressBar(downloadURL, filePath, progressBar) + progressDialog.Hide() + + if err != nil { + log.Error(err.Error()) + dialog.ShowError(err, *mainWindow) + return + } + + var installCmd string + switch osInfo.ID { + case "debian", "ubuntu", "linuxmint": + installCmd = fmt.Sprintf("sudo -S dpkg -i %s", filePath) + case "fedora": + installCmd = fmt.Sprintf("sudo -S dnf install -y %s", filePath) + } + + cmd := exec.Command("sh", "-c", installCmd) + cmd.Stdin = strings.NewReader(sudoPassword + "\n") + + dialog.ShowInformation("Installation started", + "Installation of VSCode started.", *mainWindow) + + output, err := cmd.CombinedOutput() + if err != nil { + errMsg := fmt.Errorf("installation failed:\n%s", output) + dialog.ShowError(errMsg, *mainWindow) + log.Error(errMsg.Error()) + return + } else { + dialog.ShowInformation("Success", "VSCode succesfully installed!", *mainWindow) + CheckDependencies(dependencies) + } + }() + case 1: // Docker + go func() { + progressBar := widget.NewProgressBar() + progressDialog := dialog.NewCustomWithoutButtons("Docker installation in progress...", progressBar, *mainWindow) + progressDialog.Show() + + osInfo, err := osinfo.GetLinuxDistribution() + if err != nil { + progressDialog.Hide() + errMsg := fmt.Errorf("error getting os infos: %v", err) + dialog.ShowError(errMsg, *mainWindow) + log.Error(errMsg.Error()) + return + } + + var commands []string + var cleanupCommands []string + var totalSteps int + + switch osInfo.ID { + case "ubuntu", "linuxmint", "debian": + // Ubuntu/Debian Commands + distroPath := "ubuntu" + codeName := "$(. /etc/os-release && echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\")" + if osInfo.ID == "debian" { + distroPath = "debian" + codeName = "$(. /etc/os-release && echo \"$VERSION_CODENAME\")" + } + arch := "$(dpkg --print-architecture)" + + commands = []string{ + "apt-get update", + "apt-get install -y wget", + fmt.Sprintf("wget -qO- https://download.docker.com/linux/%s/dists/%s/pool/stable/%s/ | grep -oP 'href=\"\\K[^\"]*(?=.*deb)' | xargs -I{} wget https://download.docker.com/linux/%s/dists/%s/pool/stable/%s/{}", + distroPath, codeName, arch, distroPath, codeName, arch), + "dpkg -i ./containerd.io*.deb docker-ce*.deb docker-ce-cli*.deb docker-buildx-plugin*.deb docker-compose-plugin*.deb", + "apt-get install -f -y", + "service docker start", + } + + cleanupCommands = []string{ + "rm -rf ./containerd.io*.deb ./docker-ce*.deb ./docker-ce-cli*.deb ./docker-buildx-plugin*.deb ./docker-compose-plugin*.deb", + "apt-get autoremove -y", + "apt-get clean", + } + + totalSteps = len(commands) + len(cleanupCommands) + + case "fedora": + fedoraVer := "$(rpm -E %fedora)" + commands = []string{ + "dnf install -y wget", + fmt.Sprintf("wget https://download.docker.com/linux/fedora/%s/x86_64/stable/Packages/containerd-*.rpm docker-*.rpm docker-ce-*.rpm", fedoraVer), + "dnf install -y ./*.rpm", + "systemctl enable --now docker", + } + + cleanupCommands = []string{ + "rm -rf ./containerd-*.rpm ./docker-*.rpm ./docker-ce-*.rpm", + "dnf autoremove -y", + "dnf clean all", + } + + totalSteps = len(commands) + len(cleanupCommands) + + default: + progressDialog.Hide() + dialog.ShowInformation("not supported", "Automatic Docker installation not supported for your OS.", *mainWindow) + return + } + + progressStep := 1.0 / float64(totalSteps) + currentProgress := 0.0 + + for _, cmd := range commands { + command := exec.Command("sudo", "-S", "sh", "-c", cmd) + command.Stdin = strings.NewReader(sudoPassword + "\n") + + if output, err := command.CombinedOutput(); err != nil { + progressDialog.Hide() + errMsg := fmt.Errorf("error at %s:\n%s", cmd, output) + dialog.ShowError(errMsg, *mainWindow) + log.Error(errMsg.Error()) + return + } + + currentProgress += progressStep + progressBar.SetValue(currentProgress) + } + + for _, cmd := range cleanupCommands { + command := exec.Command("sudo", "-S", "sh", "-c", cmd) + command.Stdin = strings.NewReader(sudoPassword + "\n") + + if output, err := command.CombinedOutput(); err != nil { + progressDialog.Hide() + errMsg := fmt.Errorf("cleanup error at %s:\n%s", cmd, output) + dialog.ShowError(errMsg, *mainWindow) + log.Error(errMsg.Error()) + return + } + + currentProgress += progressStep + progressBar.SetValue(currentProgress) + } + + progressDialog.Hide() + + dialog.ShowInformation( + "Installation finished", + "Docker was succesfully installed! Please re-start your system to let the changes take effect.", + *mainWindow, + ) + + CheckDependencies(dependencies) + }() + } + return nil +} + +func showInstallProgressBar(window fyne.Window, message string, cmd *exec.Cmd, depName string, dependencies []Dependency) { + progress := widget.NewProgressBarInfinite() + content := container.NewVBox( + widget.NewLabel(message), + progress, + ) + popup := widget.NewModalPopUp(content, window.Canvas()) + popup.Show() + + go func() { + err := cmd.Run() + + popup.Hide() + + if err != nil { + errMsg := fmt.Errorf("error during installation of %s: %v", depName, err) + dialog.ShowError(errMsg, window) + log.Error(errMsg.Error()) + } else { + dialog.ShowInformation("Installation finished", fmt.Sprintf("%s successfully installed!", depName), window) + CheckDependencies(dependencies) + } + }() +} diff --git a/internal/gui/dependency_screen.go b/internal/gui/dependency_screen.go index d6921ac..a6b7eb3 100644 --- a/internal/gui/dependency_screen.go +++ b/internal/gui/dependency_screen.go @@ -64,7 +64,7 @@ func ShowDependencyScreen() { ShowProjectScreen() } else { dialog.ShowInformation("dependencies missing", - "Bitte installieren Sie alle erforderlichen Abhängigkeiten, bevor Sie fortfahren.", mainWindow) + "Please install all required dependencies before proceeding.", mainWindow) } }) From f1f2a8d2c5cb1cea49dba80ee03c1b82d1cf2c7d Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Thu, 20 Mar 2025 20:57:45 +0100 Subject: [PATCH 05/38] chore: add .devcontainer directory to jakarta jsp project directory --- .../.devcontainer/.dockerignore | 8 ++++ .../jakarta-jsp-todo/.devcontainer/.gitignore | 27 ++++++++++++ .../jakarta-jsp-todo/.devcontainer/Dockerfile | 17 +++++++ .../.devcontainer/devcontainer.json | 9 ++++ .../.devcontainer/docker-compose.yml | 44 +++++++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 cmd/jws/projects/jakarta-jsp-todo/.devcontainer/.dockerignore create mode 100644 cmd/jws/projects/jakarta-jsp-todo/.devcontainer/.gitignore create mode 100644 cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile create mode 100644 cmd/jws/projects/jakarta-jsp-todo/.devcontainer/devcontainer.json create mode 100644 cmd/jws/projects/jakarta-jsp-todo/.devcontainer/docker-compose.yml diff --git a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/.dockerignore b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/.dockerignore new file mode 100644 index 0000000..017b280 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/.dockerignore @@ -0,0 +1,8 @@ +.git +.github +.settings +target +*.iml +.idea +.vscode +node_modules diff --git a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/.gitignore b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/.gitignore new file mode 100644 index 0000000..82b069a --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-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-jsp-todo/.devcontainer/Dockerfile b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile new file mode 100644 index 0000000..f7d25c5 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile @@ -0,0 +1,17 @@ +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 + +# [Optional] Uncomment this section to install additional OS packages. +# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ +# && apt-get -y install --no-install-recommends + +# [Optional] Uncomment this line to install global node packages. +# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g " 2>&1 diff --git a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/devcontainer.json b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/devcontainer.json new file mode 100644 index 0000000..cc4db71 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/devcontainer.json @@ -0,0 +1,9 @@ +{ + "name": "Java & PostgreSQL", + "dockerComposeFile": "docker-compose.yml", + "service": "app", + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", + "forwardPorts": [9080, 5432], + "postCreateCommand": "mvn clean install -DskipTests", + "remoteUser": "vscode" +} diff --git a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/docker-compose.yml b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..15ae97a --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/docker-compose.yml @@ -0,0 +1,44 @@ +version: "3.8" + +volumes: + postgres-data: + +services: + app: + container_name: javadev + build: + context: . + dockerfile: Dockerfile + environment: + # NOTE: POSTGRES_DB/USER/PASSWORD should match values in db container + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + POSTGRES_DB: postgres + POSTGRES_HOSTNAME: postgresdb + + volumes: + - ../..:/workspaces:cached + + # Overrides default command so things don't shut down after the process ends. + command: sleep infinity + + # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function. + network_mode: service:db + + # Use "forwardPorts" in **devcontainer.json** to forward an app port locally. + # (Adding the "ports" property to this file will not forward from a Codespace.) + + db: + container_name: postgresdb + image: postgres:latest + restart: unless-stopped + volumes: + - postgres-data:/var/lib/postgresql/data + environment: + # NOTE: POSTGRES_DB/USER/PASSWORD should match values in app container + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + POSTGRES_DB: postgres + + # Add "forwardPorts": ["5432"] to **devcontainer.json** to forward PostgreSQL locally. + # (Adding the "ports" property to this file will not forward from a Codespace.) From 18dccf9fb8736e06acf1d39317710d049a306586 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Thu, 20 Mar 2025 20:59:36 +0100 Subject: [PATCH 06/38] feat: improve docker installation process by adding wsl feature activation --- internal/dependency/dependency.go | 44 +++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/internal/dependency/dependency.go b/internal/dependency/dependency.go index 6853f31..ee8e0fd 100644 --- a/internal/dependency/dependency.go +++ b/internal/dependency/dependency.go @@ -126,11 +126,26 @@ func installWindowsDependencies(index int, cmd *exec.Cmd, mainWindow *fyne.Windo cmd = tools.CommandInShell("winget", "install", "-e", "--id", "Microsoft.VisualStudioCode") case 1: // Docker Desktop + wslEnabled, err := checkWslFeaturesEnabled() + if err != nil { + return nil, fmt.Errorf("error checking WSL features: %v", err) + } + + if !wslEnabled { + dialog.ShowInformation("activate wsl", "WSL has to be activated. Please confirm to active necessary features.", *mainWindow) + err = enableWslFeatures() + if err != nil { + return nil, fmt.Errorf("error enabling WSL features: %v", err) + } + dialog.ShowInformation("reboot required", "Please reboot your PC to finish wsl activation and reopen 'jws'.", *mainWindow) + return nil, fmt.Errorf("reboot required") + } + wslCheckCmd := tools.CommandInShell("wsl", "--status") - err := wslCheckCmd.Run() + err = wslCheckCmd.Run() if err != nil { wslInstallCmd := tools.CommandInShell("wsl", "--install", "ubuntu") - dialog.ShowInformation("WSL wird installiert", "WSL wird installiert. Bitte warten Sie, bis die Installation abgeschlossen ist und starten Sie die Anwendung neu.", *mainWindow) + dialog.ShowInformation("installing wsl", "WSL will be installed. Please wait untill installation is finished and reopen 'jws'.", *mainWindow) err = wslInstallCmd.Run() if err != nil { errMsg := fmt.Errorf("error: installing WSL: %v", err) @@ -145,6 +160,31 @@ func installWindowsDependencies(index int, cmd *exec.Cmd, mainWindow *fyne.Windo return cmd, nil } +func checkWslFeaturesEnabled() (bool, error) { + cmd := tools.CommandInShell("powershell", "-Command", + "[bool](Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform).State -and [bool](Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux).State") + + output, err := cmd.CombinedOutput() + if err != nil { + return false, fmt.Errorf("error executing PowerShell command: %v\nOutput: %s", err, string(output)) + } + + enabled := strings.TrimSpace(string(output)) == "True" + return enabled, nil +} + +func enableWslFeatures() error { + cmd := tools.CommandInShell("powershell", "-Command", + "Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart; Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart") + + output, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("error executing PowerShell command: %v\nOutput: %s", err, string(output)) + } + + return nil +} + func installDarwinDependencies(index int, cmd *exec.Cmd, mainWindow *fyne.Window) (*exec.Cmd, error) { brewCheckCmd := tools.CommandInShell("which", "brew") err := brewCheckCmd.Run() From acf4e95e08d635bd6615ca3b2f40cfcc73791067 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Fri, 21 Mar 2025 07:53:09 +0100 Subject: [PATCH 07/38] fix: reorder wsl checks on windows docker installation to reduce executation if elevated privileges --- build.sh | 1 + changelog.md | 18 ++++ .../jakarta-jsp-todo/.devcontainer/Dockerfile | 21 ++--- .../.devcontainer/Dockerfile.dev | 14 +++ .../.devcontainer/devcontainer.json | 9 +- .../.devcontainer/docker-compose.yml | 94 +++++++++++-------- internal/dependency/dependency.go | 37 ++++---- 7 files changed, 119 insertions(+), 75 deletions(-) create mode 100644 cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile.dev diff --git a/build.sh b/build.sh index 8a4b074..e2025de 100755 --- a/build.sh +++ b/build.sh @@ -57,6 +57,7 @@ fyne-cross windows \ -name "$NAME.exe" \ -ldflags "-s" \ -ldflags "-w" \ + -ldflags "-H=windowsgui" \ ./cmd/jws mv fyne-cross/dist/windows-amd64/jws.exe.zip packages/jws_windows.zip diff --git a/changelog.md b/changelog.md index 2d35be6..3112c67 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,23 @@ All notable changes to this project will be documented in this file. +## [0.2.0] - 2025-03-20 + +### 🚀 Features + +- Add jakarta-todo-jsp implementation +- Improve usability by including a progressbar while installing packages on windows and mac +- Improve docker installation process by adding wsl feature activation + +### 🐛 Bug Fixes + +- Reanble window resize to better support multi monitor setups with different resolutions +- Disable password dialog on windows + +### ⚙️ Miscellaneous Tasks + +- Add .devcontainer directory to jakarta jsp project directory + ## [0.1.0] - 2025-03-19 ### 🚀 Features @@ -12,6 +29,7 @@ All notable changes to this project will be documented in this file. ### 📚 Documentation - Add changelog.md +- Fix missing version info in changelog.md ## [0.0.2] - 2025-03-17 diff --git a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile index f7d25c5..4d6ed57 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile +++ b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile @@ -1,17 +1,12 @@ -FROM mcr.microsoft.com/devcontainers/java:1-21-bullseye +FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi -ARG INSTALL_MAVEN="true" -ARG MAVEN_VERSION="" +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 -ARG INSTALL_GRADLE="false" -ARG GRADLE_VERSION="" +RUN features.sh -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 +COPY --chown=1001:0 target/*.war /config/apps -# [Optional] Uncomment this section to install additional OS packages. -# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ -# && apt-get -y install --no-install-recommends - -# [Optional] Uncomment this line to install global node packages. -# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g " 2>&1 +RUN configure.sh diff --git a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile.dev b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile.dev new file mode 100644 index 0000000..412eb57 --- /dev/null +++ b/cmd/jws/projects/jakarta-jsp-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-jsp-todo/.devcontainer/devcontainer.json b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/devcontainer.json index cc4db71..a1901d5 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/devcontainer.json +++ b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/devcontainer.json @@ -3,7 +3,12 @@ "dockerComposeFile": "docker-compose.yml", "service": "app", "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", - "forwardPorts": [9080, 5432], + "forwardPorts": [9080, 5432, 9433], "postCreateCommand": "mvn clean install -DskipTests", - "remoteUser": "vscode" + "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-jsp-todo/.devcontainer/docker-compose.yml b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/docker-compose.yml index 15ae97a..854a26c 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/docker-compose.yml +++ b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/docker-compose.yml @@ -1,44 +1,56 @@ -version: "3.8" +services: + app: + container_name: javadev + build: + context: ../ + dockerfile: .devcontainer/Dockerfile.dev + volumes: + - ../..:/workspaces:cached + 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 + depends_on: + - db + networks: + - my_network + + 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: todo_db + networks: + - my_network volumes: - postgres-data: + postgres-data: -services: - app: - container_name: javadev - build: - context: . - dockerfile: Dockerfile - environment: - # NOTE: POSTGRES_DB/USER/PASSWORD should match values in db container - POSTGRES_PASSWORD: postgres - POSTGRES_USER: postgres - POSTGRES_DB: postgres - POSTGRES_HOSTNAME: postgresdb - - volumes: - - ../..:/workspaces:cached - - # Overrides default command so things don't shut down after the process ends. - command: sleep infinity - - # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function. - network_mode: service:db - - # Use "forwardPorts" in **devcontainer.json** to forward an app port locally. - # (Adding the "ports" property to this file will not forward from a Codespace.) - - db: - container_name: postgresdb - image: postgres:latest - restart: unless-stopped - volumes: - - postgres-data:/var/lib/postgresql/data - environment: - # NOTE: POSTGRES_DB/USER/PASSWORD should match values in app container - POSTGRES_PASSWORD: postgres - POSTGRES_USER: postgres - POSTGRES_DB: postgres - - # Add "forwardPorts": ["5432"] to **devcontainer.json** to forward PostgreSQL locally. - # (Adding the "ports" property to this file will not forward from a Codespace.) +networks: + my_network: + driver: bridge diff --git a/internal/dependency/dependency.go b/internal/dependency/dependency.go index ee8e0fd..95516c8 100644 --- a/internal/dependency/dependency.go +++ b/internal/dependency/dependency.go @@ -105,8 +105,10 @@ func InstallDependency(index int, sudoPassword string, dependencies []Dependency } case "darwin": cmd, err = installDarwinDependencies(index, cmd, &mainWindow) - dialog.ShowError(err, mainWindow) - log.Error(err.Error()) + if err != nil { + dialog.ShowError(err, mainWindow) + log.Error(err.Error()) + } case "linux": err = installLinuxDependencies(index, sudoPassword, cmd, dependencies, &mainWindow) if err != nil { @@ -126,34 +128,31 @@ func installWindowsDependencies(index int, cmd *exec.Cmd, mainWindow *fyne.Windo cmd = tools.CommandInShell("winget", "install", "-e", "--id", "Microsoft.VisualStudioCode") case 1: // Docker Desktop - wslEnabled, err := checkWslFeaturesEnabled() - if err != nil { - return nil, fmt.Errorf("error checking WSL features: %v", err) - } - - if !wslEnabled { - dialog.ShowInformation("activate wsl", "WSL has to be activated. Please confirm to active necessary features.", *mainWindow) - err = enableWslFeatures() - if err != nil { - return nil, fmt.Errorf("error enabling WSL features: %v", err) - } - dialog.ShowInformation("reboot required", "Please reboot your PC to finish wsl activation and reopen 'jws'.", *mainWindow) - return nil, fmt.Errorf("reboot required") - } - wslCheckCmd := tools.CommandInShell("wsl", "--status") - err = wslCheckCmd.Run() + err := wslCheckCmd.Run() if err != nil { wslInstallCmd := tools.CommandInShell("wsl", "--install", "ubuntu") dialog.ShowInformation("installing wsl", "WSL will be installed. Please wait untill installation is finished and reopen 'jws'.", *mainWindow) err = wslInstallCmd.Run() if err != nil { + wslEnabled, err := checkWslFeaturesEnabled() + if err != nil { + return nil, fmt.Errorf("error checking WSL features: %v", err) + } + if !wslEnabled { + dialog.ShowInformation("activate wsl", "WSL has to be activated. Please confirm to active necessary features.", *mainWindow) + err = enableWslFeatures() + if err != nil { + return nil, fmt.Errorf("error enabling WSL features: %v", err) + } + dialog.ShowInformation("reboot required", "Please reboot your PC to finish wsl activation and reopen 'jws'.", *mainWindow) + return nil, fmt.Errorf("reboot required") + } errMsg := fmt.Errorf("error: installing WSL: %v", err) return nil, errMsg } return nil, err } - cmd = tools.CommandInShell("winget", "install", "-e", "--id", "Docker.DockerDesktop") } From 3a32b39f3d3a22bdc2f1102d7d4b17aaf00a0860 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Fri, 21 Mar 2025 10:23:34 +0100 Subject: [PATCH 08/38] feat: finalize jakarta-jsp devcontainer setup --- .../jakarta-jsp-todo/.devcontainer/Dockerfile | 2 +- .../.devcontainer/docker-compose.yml | 4 ++ .../{ => .devcontainer}/init.sql | 0 cmd/jws/projects/jakarta-jsp-todo/Dockerfile | 62 ------------------- .../jakarta-jsp-todo/docker-compose.yml | 50 --------------- .../java/com/todoapp/util/HibernateUtil.java | 2 +- .../main/resources/META-INF/persistence.xml | 2 +- 7 files changed, 7 insertions(+), 115 deletions(-) rename cmd/jws/projects/jakarta-jsp-todo/{ => .devcontainer}/init.sql (100%) delete mode 100644 cmd/jws/projects/jakarta-jsp-todo/Dockerfile delete mode 100644 cmd/jws/projects/jakarta-jsp-todo/docker-compose.yml diff --git a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile index 4d6ed57..e9d615d 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile +++ b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile @@ -7,6 +7,6 @@ RUN mkdir -p /config/lib && \ RUN features.sh -COPY --chown=1001:0 target/*.war /config/apps +#COPY --chown=1001:0 target/*.war /config/apps RUN configure.sh diff --git a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/docker-compose.yml b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/docker-compose.yml index 854a26c..3141d45 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/docker-compose.yml +++ b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/docker-compose.yml @@ -6,6 +6,7 @@ services: dockerfile: .devcontainer/Dockerfile.dev volumes: - ../..:/workspaces:cached + - ./app:/app environment: POSTGRES_HOST: postgresdb POSTGRES_PORT: 5432 @@ -30,6 +31,8 @@ services: POSTGRES_DB: todo_db POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres + volumes: + - ./app:/config/dropins depends_on: - db networks: @@ -41,6 +44,7 @@ services: 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 diff --git a/cmd/jws/projects/jakarta-jsp-todo/init.sql b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/init.sql similarity index 100% rename from cmd/jws/projects/jakarta-jsp-todo/init.sql rename to cmd/jws/projects/jakarta-jsp-todo/.devcontainer/init.sql diff --git a/cmd/jws/projects/jakarta-jsp-todo/Dockerfile b/cmd/jws/projects/jakarta-jsp-todo/Dockerfile deleted file mode 100644 index 8889dbd..0000000 --- a/cmd/jws/projects/jakarta-jsp-todo/Dockerfile +++ /dev/null @@ -1,62 +0,0 @@ -# # Dockerfile für OpenLiberty -# FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi -# COPY --chown=1001:0 /src/main/liberty/config /config -# -# # PostgreSQL JDBC-Treiber laden -# # RUN mkdir -p ./lib && \ -# # curl -o ./lib/postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.6.0.jar -# -# RUN 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 -# -# # # Arbeitsverzeichnis setzen -# # WORKDIR /opt/ol/wlp/usr/servers/defaultServer -# # -# # # Notwendige Dateien kopieren -# # COPY target/todo-app.war ./apps/ -# # # COPY server.xml ./ -# # -# # # PostgreSQL JDBC-Treiber laden -# # RUN mkdir -p ./lib && \ -# # curl -o ./lib/postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.6.0.jar -# # -# # # OpenLiberty starten -# # CMD ["/opt/ol/wlp/bin/server", "run", "defaultServer"] - -# FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi -# -# # COPY --chown=1001:0 /src/main/liberty/config /config -# # -# # COPY --chown=1001:0 /src/main/liberty/config/server.xml /opt/ol/wlp/usr/servers/defaultServer/ -# -# RUN chmod 644 /opt/ol/wlp/usr/servers/defaultServer/server.xml -# -# -# # 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 - -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-jsp-todo/docker-compose.yml b/cmd/jws/projects/jakarta-jsp-todo/docker-compose.yml deleted file mode 100644 index df9af86..0000000 --- a/cmd/jws/projects/jakarta-jsp-todo/docker-compose.yml +++ /dev/null @@ -1,50 +0,0 @@ -version: "3.8" - -services: - postgres: - image: postgres:15 - networks: - - my_network - container_name: postgres_db - restart: always - environment: - POSTGRES_DB: todo_db - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - ports: - - "5432:5432" - volumes: - - postgres_data:/var/lib/postgresql/data - - ./init.sql:/docker-entrypoint-initdb.d/init.sql - healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] - interval: 5s - timeout: 5s - retries: 10 - - openliberty: - build: . - container_name: openliberty_app - networks: - - my_network - restart: always - ports: - - "9080:9080" - - "9443:9443" - depends_on: - - postgres - environment: - - POSTGRES_HOST=postgres - - POSTGRES_PORT=5432 - - POSTGRES_DB=todo_db - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - volumes: - - ./src/main/liberty/config/server.xml:/config/server.xml - # - ./src/main/liberty/config/server.xml:/opt/ol/wlp/usr/servers/defaultServer/server.xml - -volumes: - postgres_data: -networks: - my_network: - driver: bridge diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/HibernateUtil.java b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/HibernateUtil.java index 2e5f645..e868bc6 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/HibernateUtil.java +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/java/com/todoapp/util/HibernateUtil.java @@ -61,7 +61,7 @@ public class HibernateUtil { try { Configuration configuration = new Configuration(); configuration.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver"); - configuration.setProperty("hibernate.connection.url", "jdbc:postgresql://postgres:5432/todo_db"); + configuration.setProperty("hibernate.connection.url", "jdbc:postgresql://postgresdb:5432/todo_db"); configuration.setProperty("hibernate.connection.username", "postgres"); configuration.setProperty("hibernate.connection.password", "postgres"); diff --git a/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/META-INF/persistence.xml b/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/META-INF/persistence.xml index c69c584..1e6b316 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/META-INF/persistence.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/src/main/resources/META-INF/persistence.xml @@ -9,7 +9,7 @@ com.todoapp.model.Todo - + From 5ac9e64eb50d5835bd387f928c705314aa134a1c Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Fri, 21 Mar 2025 10:24:07 +0100 Subject: [PATCH 09/38] docs: update changelog --- changelog.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/changelog.md b/changelog.md index 3112c67..6666221 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,16 @@ All notable changes to this project will be documented in this file. +## [0.3.0] - 2025-03-21 + +### 🚀 Features + +- Finalize jakarta-jsp devcontainer setup + +### 🐛 Bug Fixes + +- Reorder wsl checks on windows docker installation to reduce executation if elevated privileges + ## [0.2.0] - 2025-03-20 ### 🚀 Features From 111756ffe5766f2c121c8156f6deb016d629a02e Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Fri, 21 Mar 2025 11:53:19 +0100 Subject: [PATCH 10/38] build: add clean up step to build.sh --- build.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.sh b/build.sh index e2025de..31b7071 100755 --- a/build.sh +++ b/build.sh @@ -73,5 +73,9 @@ fyne build ./cmd/jws tar -cJf packages/jws_linux_exe.tar.xz ./jws tar -cJf packages/jws_linux_bundle.tar.xz ./jws.tar.xz +echo "Performing Clean Up" +rm -rf fyne-cross +rm jws jws.tar.xz + echo "Build abgeschlossen! Dateien finden sich im packages-Ordner:" ls -lh packages/ From d851c1b628532176df4ecf52c5ec06d76e349502 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Fri, 21 Mar 2025 15:12:48 +0100 Subject: [PATCH 11/38] feat: optimize software installation on windows and add information splash screen on startup --- .gitignore | 4 +++ cmd/jws/Icon.png | Bin 2375 -> 265627 bytes cmd/jws/main.go | 54 ++++++++++++++++++++++++------ internal/dependency/dependency.go | 4 +-- 4 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..15486c1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.settings/ +MacOSX11.3.sdk +MacOSX11.3.sdk.tar.xz +packages diff --git a/cmd/jws/Icon.png b/cmd/jws/Icon.png index b9c666c8b562ce1ed8dc2a5dcaaded184093088a..b978900168d1911b38e9e87ab757264c5201159f 100644 GIT binary patch literal 265627 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

Tq{Lxxj8l|KR?+YoJY6acW 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 xbYX3905UK#H7zhREiy4wF*7z9msE6GHor*4 zNG(O0{W=iJOrkqOb9_`R{`NB?CEKvej8tPe@;{=086RBwwRAz|rO{Y~i!tr7qC#pL|dpn^8@ z=E4o9u_J8HOQu0RINzu1NVG2e*_bj#vGs<5Ji1V+bv%n$$2r6O?;IM7 zw*Q3*VRuK0V#m+Tx9{VG?}ga#kv!M9^RCx?4ick6W-60zS2RTP2wdBG#oeCqZM0JK z<{ujj3vT=w!HKue>)}O*-0#k}-R)fWxZJpQIo;ew*8a_#>o*QOi@HbM-13<1r1B}L z4$X?+H{v`ci{JQ!cf;1cN^BZ;ckdH}1@|5GmkS@XRGi5)CKNw&jAab@z8d=dU`NK( zZ-xJC7s;(MKBhEnbsLGESUTO|`_rGxqWfR8s2aLxo&CD{5<$bHQTG*(xnrnCrNXu8 z#oQ*96$>eN)4jh5-O0S9XsT5C^4dLo=B7Ot&)h|Ausf=%D{AtuYC6r-U@QJm9dx=3 zCik{B&N#_QO2!LqaF&zu6jwXP{JqHu?HQ^LuLRt#$qIh(IW9s+R~(2~$whiI7rt{2 zz#0V$E@w~DnEM^1_;u6*s1dcCJ4O@zl`2_!;>$*gv)lwGa-#G%6O`>iYNJ-GUZtM| z|EyMlf|I4Ij2hMrGxfq=ir<*si9{=(pAzq7qS9Up@((o|wj~G3N7mpjbRY%hXxMlN zA@2xPDLKUOp$W0`uGpR|9p*;9@~SQiTOtP84I=Eaz9JEGaOF<$>oxd`_x;NmF5OY+`C%)+mL;1LWK;8h7XY~k*RIy$#amz}m-bt1hQ`WLy2KFl zo`Iw@P%D89gFc|VQA$_3LKs5@ne#SCwbE83%uT~Yiv{2!A`E}^-f_FGspQecZ*`#8 z)#G_Lf;|sCU2VV+gf{ivzxeYa892u2_0!#cWr*+-Ke>Sn5t^l(`Ze{NMHumYEg!(@ zDA>kjqW3@AADwENJc)#9SteZXFVRBUZNN~=(qm}ByU$OF{u*KocW}RfF+W#wD2)P! zw}KG|eUYX_VU`0D3M>SWWSg-*7p8e89|U%*!5ukzPhg3g0a>8}KA>US3EB2a>_k~X z2fot64sE0@+a}WgpiygrTUJ%A(eBBop^$){4P_SkKXawIqhwo z@ro4>KfdUYq-SjXYqtfmMEBlG)l?CmhFOTjw)29Ypwn*6%n z4&Nw#d5#4zSQRmobM{=^hb*ue2HQy4#x_J2+3q}!L;(Cf3kM#Ya*x8NqM%)d_xZ-9 zReykzr@N0~ZX|mveM5Z;(??B@`Dg~2ezpWjU5PnSQ26k)yCr^D$4xt5OK=VavvPdV zn$Rc{S1eihh{Zt2Oo6Q{NX5rpz1om;Ng$$k)^Wh-1or5Q7^N!MbLrS5KA*N zU|7}@&7f$ln?OCv<>u~LI7`$cBqF~KEEI>2f~RtImG3NQA0E0z;$fQkoWrSry{wM0 zK^m*3T8qo^(?SG*M1Fh^uoxjl^c@KI^$xi$Y!GQ0`1$M4f$AG!9ak9 z1vVL)P!d9y6RE~4_Fa&mL{4RYoI5FxZpeE7Z~q|NEscE`9<>t0NOT${N|flqx@V)_ zCNjx^7Hot*Uzm3xEHDViUh)jNH-}nds{G0nf}AAv96=i0NC8-{b@zmQ@AQwlg3+RB z*Iy{8wd_;(bW@?P`plN@iT*d1Y@~f*jF#9#^n&yLCi>j)^+X}0HGi!d%An`#iM*c- z^oD!Y+n9`aFRaA}S}%7&R^9G+S3B`6xw$H)`bfd1?sVsb8I{P5wHLQaL7AP@-oDdi z^xCSP9b3{SE6&$@Zcgv#=3It2<%b)EwWG<|K4j_G)x^1(8C!KMi7QW>d${GP+Eg}j zyyx<9gM3HZrYUzj)_>F&ynnaKY4YjD;jY!=Ktjh d5l*yAg==Q5+oTg*Q}#I_`FaL;)Cfgc{{^bg+hqU% 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 + + + +

+ + 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 769f9fda067a5941976e673525544bebd462d8e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1566 zcmah}%Tg0T6g@o&1d>4@;f;nMf(b;%H);UI0IMKMQn+rCHV(`qHPb=(E3LB1!iD9^ zh2LaZ-kwAv+H>F7nA zp}%B0;#Je$6JCW=9)@Jet#WIZd!|~qH>2{sNr}fxR|r;_s-EDI04B3%qHM}&1;!K< zgN}OXamVLXrOBvtzPVNC1;dDrE_5d_hKU%)8K(bhnvO|aXNa|3Wf)dIoh?B?Au6d# z3}aW(B#d{aQ(LnvawD5-fi$IQ86~O~N$oA0b%)EQM{4sI0+z4BT`lzB7Q;|^qqI@1 zWMpP@XL~E7S|%f7m?O<$cRRi*6S6vTm}f||Tz=CO-Z8^QSYcUurc*D3G#4%I`voQ7 zV!u_68=@A#6cWf|F@`$~>3>J+Fpy#Bs|&d!{H7(9A5{5fqehiiH1F$pfQJlSw(#oY z&Rm#a>lFli&Q*mls7ZwCo>cfo$t6L#U4{Ha$5T9`4pyaMSPF-=bcTdqok>A0>sV2p z((MV`J*1qPNr(fX`$1k3T9&+eu*DngR}e3|O|L38P4!On_FG?6J%(v&*$Dj^2u$@Y z%`sZ3xrgR1n(4XGn4pzGGgG_sU!Z@Y4-MC7RKcL2ej4>w00uBfD{4ceDC#fd5bY_T zBJFAFd;T+q7fvv$p#v8Wjs^)Z89+l^8@lBoby?ZI&bxNT4>TSOFG`u}ec!CH_h6wAYg!NOxkMNjq z&b#q}NUIV|1*B)mkEIB{V|FY51AS^Qe}Y2Gp-5nO5>XXS2{ITW{b|eui8C#j)5KF) d#dGpwfKHWX8eY)79mul<~}NBc(3!VQ2Qco$q|-n_s_w`~>h6PfExM%(X+`RiC7P;wje;JIZq#VJ9r1 zATW6>KT6k=LDzkAbgbG&Ag4R@@1Fcq{Z9q^HBL{Giu%jFgGRma zPM~PC@sz;S0P8~&>4f)kCV}11>-m9g9P~U-a-cjVgTNToqEMtJAX)+=&vl^9jzGRr zZ3+~2DPS3S%sZIDtiZ&+4%9)0eL1@m4fLS-+5M2cNy>TEhy zsSb>hh(AVNHyso)!n8O|o30FJS$d-cX{2JzT)^qeVUcb-xPq%z^1r#WgJAts3pcLg z-E%ppK+6K$bufi#0fzts;Xz5Eo zr5C88mO*6e^N=E&nMCek`yV1pXV@AhQYDevB}CFy=eSL~gZs&2nc&|8+7F5TD8}PI DDg5&4 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 bfe39e7fd76bd3c799f1f19fab64c8b75379d716..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2614 zcma)8Yg5}s6g}$)GLG`7^8hDlzyyN932ORC+L+Q12*Is^6sXgXz7}hP1+rwMHG#gr z^)K{qbf!awbfz=?+8@>FU0F5;h8V-(Cg0+o|X9-$S3CTY*?^b$k5*zVHgZs3lV z^0c;GccfJnCCj(gZ87aQuH@2k9iO4E*oar7i{71uPpNmO>JfQ|tSQmvj_jyY}H#8Y;R@+O~kY1u~6A{+?}5q?!o{}hIC zL&FHeXtOl0VL`_zvJAQ}!7|u1AJ}fZ9 zrK8=kS8H~Na@;P4$s?^&rM9z!X3kHkt~A}pt}hdy#*9l#+CtUqzK&@;APG>t9&?XZ zg;aIA(WOpJ4TP#lV3r}`Itk1%^pc9{RFc9>VjdrBC=i-M*)+E3_yk2thPsg3)ZG`` z12vVkreTp_w|B)Mm?Rc(T0K71v5Xal1gUpb;W_3l%yF!wj6c&+!jp#7XPS9Zg|cgE z{VJa7Si>_)tn3M{n&3*d8<}GzMckJ&b{dv39TCr=ec9r z!XGZW?pD3leqx16XrtxG##QR56U?8r**BHh_9=8R!)<%Tk|KY$2VMeubnvhyWWC@x z!ke+V?+ahU_Y5N)NKeXL!;cKt{@aw8Z2(1vZj>nLi#kzVD>P~}Q)7b0D2;UM((@F} z3>q1Y@$r|?f1{TO&d^gC1Lts-o_fQ8W^d3eh7`_|)rG(+f{W-29Q{I$WArUE{yWn9 zxU!f_Wo{kddK9_T*a318E6hCa%wpIoOgh|591@rI)?Ai2bQxDzCi zp?`bcr{D>)9>NFY=N@@e2{yjugCr(TOzmlnxF7@F7K8j#5HIqv{3|{x~=uYep zEIfUQrF-#o{MJ4mr{fo6`&d Date: Fri, 21 Mar 2025 20:51:41 +0100 Subject: [PATCH 13/38] docs: update changelog --- changelog.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/changelog.md b/changelog.md index 6666221..6ea6a71 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,17 @@ All notable changes to this project will be documented in this file. +## [0.4.0] - 2025-03-21 + +### 🚀 Features + +- Optimize software installation on windows and add information splash screen on startup +- Add complete example for Jakarta Faces and a devcontainer setup + +### 💼 Other + +- Add clean up step to build.sh + ## [0.3.0] - 2025-03-21 ### 🚀 Features @@ -12,6 +23,10 @@ All notable changes to this project will be documented in this file. - Reorder wsl checks on windows docker installation to reduce executation if elevated privileges +### 📚 Documentation + +- Update changelog + ## [0.2.0] - 2025-03-20 ### 🚀 Features From d605c3bd7d885dd7e25a765aa20038944e9598cc Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Sun, 23 Mar 2025 00:35:03 +0100 Subject: [PATCH 14/38] feat: add jakarta rest todo implementation with devcontainer setup --- .../.devcontainer/.dockerignore | 8 ++ .../.devcontainer/.gitignore | 27 ++++ .../.devcontainer/Dockerfile | 12 ++ .../.devcontainer/Dockerfile.dev | 14 ++ .../.devcontainer/devcontainer.json | 14 ++ .../.devcontainer/docker-compose.yml | 60 ++++++++ .../jakarta-rest-todo/.devcontainer/init.sql | 19 +++ cmd/jws/projects/jakarta-rest-todo/pom.xml | 112 +++++++++++++++ .../main/java/com/todoapp/dao/TodoDAO.java | 135 ++++++++++++++++++ .../main/java/com/todoapp/dao/UserDAO.java | 124 ++++++++++++++++ .../java/com/todoapp/dto/LoginRequest.java | 23 +++ .../com/todoapp/dto/RegistrationRequest.java | 32 +++++ .../src/main/java/com/todoapp/model/Todo.java | 109 ++++++++++++++ .../src/main/java/com/todoapp/model/User.java | 101 +++++++++++++ .../java/com/todoapp/rest/AuthResource.java | 95 ++++++++++++ .../com/todoapp/rest/TodoApplication.java | 9 ++ .../java/com/todoapp/rest/TodoResource.java | 130 +++++++++++++++++ .../security/BasicAuthenticationFilter.java | 104 ++++++++++++++ .../java/com/todoapp/security/CORSFilter.java | 20 +++ .../java/com/todoapp/util/HibernateUtil.java | 41 ++++++ .../src/main/liberty/config/server.xml | 39 +++++ .../main/resources/META-INF/persistence.xml | 20 +++ .../src/main/resources/hibernate.cfg.xml | 26 ++++ .../src/main/webapp/WEB-INF/web.xml | 12 ++ 24 files changed, 1286 insertions(+) create mode 100644 cmd/jws/projects/jakarta-rest-todo/.devcontainer/.dockerignore create mode 100644 cmd/jws/projects/jakarta-rest-todo/.devcontainer/.gitignore create mode 100644 cmd/jws/projects/jakarta-rest-todo/.devcontainer/Dockerfile create mode 100644 cmd/jws/projects/jakarta-rest-todo/.devcontainer/Dockerfile.dev create mode 100644 cmd/jws/projects/jakarta-rest-todo/.devcontainer/devcontainer.json create mode 100644 cmd/jws/projects/jakarta-rest-todo/.devcontainer/docker-compose.yml create mode 100644 cmd/jws/projects/jakarta-rest-todo/.devcontainer/init.sql create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dao/TodoDAO.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dao/UserDAO.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dto/LoginRequest.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dto/RegistrationRequest.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/model/Todo.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/model/User.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/rest/AuthResource.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/rest/TodoApplication.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/rest/TodoResource.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/security/BasicAuthenticationFilter.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/security/CORSFilter.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/util/HibernateUtil.java create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/liberty/config/server.xml create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/resources/META-INF/persistence.xml create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/resources/hibernate.cfg.xml create mode 100644 cmd/jws/projects/jakarta-rest-todo/src/main/webapp/WEB-INF/web.xml diff --git a/cmd/jws/projects/jakarta-rest-todo/.devcontainer/.dockerignore b/cmd/jws/projects/jakarta-rest-todo/.devcontainer/.dockerignore new file mode 100644 index 0000000..017b280 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/.devcontainer/.dockerignore @@ -0,0 +1,8 @@ +.git +.github +.settings +target +*.iml +.idea +.vscode +node_modules diff --git a/cmd/jws/projects/jakarta-rest-todo/.devcontainer/.gitignore b/cmd/jws/projects/jakarta-rest-todo/.devcontainer/.gitignore new file mode 100644 index 0000000..82b069a --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-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-rest-todo/.devcontainer/Dockerfile b/cmd/jws/projects/jakarta-rest-todo/.devcontainer/Dockerfile new file mode 100644 index 0000000..e9d615d --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-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-rest-todo/.devcontainer/Dockerfile.dev b/cmd/jws/projects/jakarta-rest-todo/.devcontainer/Dockerfile.dev new file mode 100644 index 0000000..412eb57 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-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-rest-todo/.devcontainer/devcontainer.json b/cmd/jws/projects/jakarta-rest-todo/.devcontainer/devcontainer.json new file mode 100644 index 0000000..a1901d5 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-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-rest-todo/.devcontainer/docker-compose.yml b/cmd/jws/projects/jakarta-rest-todo/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..3141d45 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-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-rest-todo/.devcontainer/init.sql b/cmd/jws/projects/jakarta-rest-todo/.devcontainer/init.sql new file mode 100644 index 0000000..818eadb --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/.devcontainer/init.sql @@ -0,0 +1,19 @@ +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) +); + +INSERT INTO users (username, password, email) VALUES +('test', '$2a$12$nt7xQKNDKZhxQFZGD5Wy0.Uh0wdPtWDgwfnWnPLgBWnQDGGkNLKBi', 'test@example.com'); diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index e69de29..e0eee0f 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -0,0 +1,112 @@ + + + 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.servlet.jsp.jstl + jakarta.servlet.jsp.jstl-api + 3.0.0 + + + org.glassfish.web + jakarta.servlet.jsp.jstl + 3.0.1 + + + + + jakarta.ws.rs + jakarta.ws.rs-api + 3.1.0 + provided + + + + + jakarta.json.bind + jakarta.json.bind-api + 3.0.0 + provided + + + + + jakarta.json + jakarta.json-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-rest-todo/src/main/java/com/todoapp/dao/TodoDAO.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dao/TodoDAO.java new file mode 100644 index 0000000..45d5557 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dao/TodoDAO.java @@ -0,0 +1,135 @@ +package com.todoapp.dao; + +import com.todoapp.model.Todo; +import com.todoapp.model.User; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.hibernate.query.Query; +import java.util.List; + +@ApplicationScoped +public class TodoDAO { + + @Inject + private SessionFactory sessionFactory; + + @Inject + private UserDAO userDAO; + + public Todo saveTodo(Todo todo, String username) { + Transaction transaction = null; + try (Session session = sessionFactory.openSession()) { + transaction = session.beginTransaction(); + + // Benutzer aus der Datenbank holen + User user = userDAO.getUserByUsername(username); + if (user == null) { + throw new IllegalArgumentException("User not found"); + } + + todo.setUser(user); + session.persist(todo); + transaction.commit(); + return todo; + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + throw new RuntimeException("Error saving todo", e); + } + } + + public Todo updateTodo(Todo todo) { + Transaction transaction = null; + try (Session session = sessionFactory.openSession()) { + transaction = session.beginTransaction(); + Todo updatedTodo = session.merge(todo); + transaction.commit(); + return updatedTodo; + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + throw new RuntimeException("Error updating todo", e); + } + } + + public boolean deleteTodo(Long id) { + Transaction transaction = null; + try (Session session = sessionFactory.openSession()) { + transaction = session.beginTransaction(); + Todo todo = session.get(Todo.class, id); + if (todo != null) { + session.remove(todo); + transaction.commit(); + return true; + } + return false; + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + throw new RuntimeException("Error deleting todo", e); + } + } + + public Todo getTodoById(Long id) { + try (Session session = sessionFactory.openSession()) { + return session.get(Todo.class, id); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error getting todo by ID", e); + } + } + + public List getAllTodos() { + try (Session session = sessionFactory.openSession()) { + return session.createQuery("FROM Todo", Todo.class).list(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error getting all todos", e); + } + } + + public List getTodosByUsername(String username) { + try (Session session = sessionFactory.openSession()) { + Query query = session.createQuery( + "FROM Todo t WHERE t.user.username = :username ORDER BY t.completed, t.targetDate", Todo.class); + query.setParameter("username", username); + return query.list(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error getting todos by username", e); + } + } + + public List getCompletedTodosByUsername(String username) { + try (Session session = sessionFactory.openSession()) { + Query query = session.createQuery( + "FROM Todo t WHERE t.user.username = :username AND t.completed = true", Todo.class); + query.setParameter("username", username); + return query.list(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error getting completed todos", e); + } + } + + public List getIncompleteTodosByUsername(String username) { + try (Session session = sessionFactory.openSession()) { + Query query = session.createQuery( + "FROM Todo t WHERE t.user.username = :username AND t.completed = false ORDER BY t.targetDate", Todo.class); + query.setParameter("username", username); + return query.list(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error getting incomplete todos", e); + } + } +} diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dao/UserDAO.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dao/UserDAO.java new file mode 100644 index 0000000..3893bb7 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dao/UserDAO.java @@ -0,0 +1,124 @@ +package com.todoapp.dao; + +import com.todoapp.model.User; +import com.todoapp.util.HibernateUtil; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.hibernate.query.Query; +import java.util.List; +import java.util.Optional; + +@ApplicationScoped +public class UserDAO { + + @Inject + private SessionFactory sessionFactory; + + public User saveUser(User user) { + Transaction transaction = null; + try (Session session = sessionFactory.openSession()) { + transaction = session.beginTransaction(); + session.persist(user); + transaction.commit(); + return user; + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + throw new RuntimeException("Error saving user", e); + } + } + + public User updateUser(User user) { + Transaction transaction = null; + try (Session session = sessionFactory.openSession()) { + transaction = session.beginTransaction(); + User updatedUser = session.merge(user); + transaction.commit(); + return updatedUser; + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + throw new RuntimeException("Error updating user", e); + } + } + + public boolean deleteUser(Long id) { + Transaction transaction = null; + try (Session session = sessionFactory.openSession()) { + transaction = session.beginTransaction(); + User user = session.get(User.class, id); + if (user != null) { + session.remove(user); + transaction.commit(); + return true; + } + return false; + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + e.printStackTrace(); + throw new RuntimeException("Error deleting user", e); + } + } + + public User getUserById(Long id) { + try (Session session = sessionFactory.openSession()) { + return session.get(User.class, id); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error getting user by ID", e); + } + } + + public User getUserByUsername(String username) { + try (Session session = sessionFactory.openSession()) { + Query query = session.createQuery("FROM User WHERE username = :username", User.class); + query.setParameter("username", username); + return query.uniqueResult(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error getting user by username", e); + } + } + + public List getAllUsers() { + try (Session session = sessionFactory.openSession()) { + return session.createQuery("FROM User", User.class).list(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error getting all users", e); + } + } + + public boolean usernameExists(String username) { + try (Session session = sessionFactory.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(); + throw new RuntimeException("Error checking if username exists", e); + } + } + + public boolean emailExists(String email) { + try (Session session = sessionFactory.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(); + throw new RuntimeException("Error checking if email exists", e); + } + } +} diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dto/LoginRequest.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dto/LoginRequest.java new file mode 100644 index 0000000..5608a6e --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dto/LoginRequest.java @@ -0,0 +1,23 @@ +package com.todoapp.dto; + +public class LoginRequest { + private String username; + private String password; + + // Getter und Setter + 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; + } +} diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dto/RegistrationRequest.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dto/RegistrationRequest.java new file mode 100644 index 0000000..04561ec --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/dto/RegistrationRequest.java @@ -0,0 +1,32 @@ +package com.todoapp.dto; + +public class RegistrationRequest { + private String username; + private String password; + private String email; + + // Getter und Setter + 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; + } +} diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/model/Todo.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/model/Todo.java new file mode 100644 index 0000000..18560e4 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/model/Todo.java @@ -0,0 +1,109 @@ +package com.todoapp.model; + +import jakarta.persistence.*; +import jakarta.json.bind.annotation.JsonbTransient; +import java.io.Serializable; +import java.util.Date; + +@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") + @Temporal(TemporalType.DATE) + private Date targetDate; + + @Column + private boolean completed; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + @JsonbTransient // Verhindert zirkuläre Referenzen + private User user; + + // Konstruktoren + public Todo() { + } + + public Todo(String title, String description, Date 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 Date getTargetDate() { + return targetDate; + } + + public void setTargetDate(Date 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; + } + + // Zusätzliche Methode für REST-Antworten + public Long getUserId() { + return user != null ? user.getId() : null; + } + + @Override + public String toString() { + return "Todo{" + + "id=" + id + + ", title='" + title + '\'' + + ", description='" + description + '\'' + + ", targetDate=" + targetDate + + ", completed=" + completed + + '}'; + } +} diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/model/User.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/model/User.java new file mode 100644 index 0000000..e530617 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/model/User.java @@ -0,0 +1,101 @@ +package com.todoapp.model; + +import jakarta.persistence.*; +import jakarta.json.bind.annotation.JsonbTransient; +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) + @JsonbTransient // Verhindert, dass das Passwort in JSON serialisiert wird + private String password; + + @Column(nullable = false) + private String email; + + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonbTransient // Verhindert zirkuläre Referenzen bei der JSON-Serialisierung + 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-rest-todo/src/main/java/com/todoapp/rest/AuthResource.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/rest/AuthResource.java new file mode 100644 index 0000000..1e8a901 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/rest/AuthResource.java @@ -0,0 +1,95 @@ +package com.todoapp.rest; + +import com.todoapp.dao.UserDAO; +import com.todoapp.model.User; +import com.todoapp.dto.LoginRequest; +import com.todoapp.dto.RegistrationRequest; + +import jakarta.annotation.security.RolesAllowed; +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import at.favre.lib.crypto.bcrypt.BCrypt; +import java.util.Map; + +@Path("/auth") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class AuthResource { + + @Inject + private UserDAO userDAO; + + @POST + @Path("/register") + public Response register(RegistrationRequest request) { + if (request.getUsername() == null || request.getPassword() == null || request.getEmail() == null) { + return Response.status(Response.Status.BAD_REQUEST) + .entity(Map.of("error", "Username, password, and email are required")) + .build(); + } + + if (userDAO.usernameExists(request.getUsername())) { + System.out.println(userDAO.usernameExists(request.getUsername())); + return Response.status(Response.Status.CONFLICT) + .entity(Map.of("error", "Username already exists")) + .build(); + } + + if (userDAO.emailExists(request.getEmail())) { + return Response.status(Response.Status.CONFLICT) + .entity(Map.of("error", "Email already exists")) + .build(); + } + + User user = new User(); + user.setUsername(request.getUsername()); + user.setEmail(request.getEmail()); + + String hashedPassword = BCrypt.withDefaults() + .hashToString(12, request.getPassword().toCharArray()); + user.setPassword(hashedPassword); + + userDAO.saveUser(user); + + return Response.status(Response.Status.CREATED) + .entity(Map.of("message", "User registered successfully")) + .build(); + } + + @POST + @RolesAllowed("user") + @Path("/login") + public Response login(LoginRequest request) { + // Validierung + if (request.getUsername() == null || request.getPassword() == null) { + return Response.status(Response.Status.BAD_REQUEST) + .entity(Map.of("error", "Username and password are required")) + .build(); + } + + // Benutzer suchen + User user = userDAO.getUserByUsername(request.getUsername()); + if (user == null) { + return Response.status(Response.Status.UNAUTHORIZED) + .entity(Map.of("error", "Invalid credentials")) + .build(); + } + + // Passwort überprüfen + BCrypt.Result result = BCrypt.verifyer() + .verify(request.getPassword().toCharArray(), user.getPassword()); + if (!result.verified) { + return Response.status(Response.Status.UNAUTHORIZED) + .entity(Map.of("error", "Invalid credentials")) + .build(); + } + + // Erfolgreiche Anmeldung + return Response.ok(Map.of( + "message", "Login successful", + "username", user.getUsername(), + "email", user.getEmail())).build(); + } +} diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/rest/TodoApplication.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/rest/TodoApplication.java new file mode 100644 index 0000000..6ab8ce0 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/rest/TodoApplication.java @@ -0,0 +1,9 @@ +package com.todoapp.rest; + +import jakarta.ws.rs.ApplicationPath; +import jakarta.ws.rs.core.Application; + +@ApplicationPath("/api") +public class TodoApplication extends Application { + // Die leere Klasse ist ausreichend, um den REST-Endpunkt zu definieren +} diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/rest/TodoResource.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/rest/TodoResource.java new file mode 100644 index 0000000..9e0575f --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/rest/TodoResource.java @@ -0,0 +1,130 @@ +package com.todoapp.rest; + +import com.todoapp.dao.TodoDAO; +import com.todoapp.model.Todo; +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.SecurityContext; +import java.util.List; + +@Path("/todos") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class TodoResource { + + @Inject + private TodoDAO todoDAO; + + @GET + public Response getAllTodos(@Context SecurityContext securityContext) { + String username = securityContext.getUserPrincipal().getName(); + List todos = todoDAO.getTodosByUsername(username); + return Response.ok(todos).build(); + } + + @GET + @Path("/{id}") + public Response getTodoById(@PathParam("id") Long id, @Context SecurityContext securityContext) { + String username = securityContext.getUserPrincipal().getName(); + Todo todo = todoDAO.getTodoById(id); + + if (todo == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + + // Sicherheitscheck: Nutzer darf nur eigene Todos sehen + if (!todo.getUser().getUsername().equals(username)) { + return Response.status(Response.Status.FORBIDDEN).build(); + } + + return Response.ok(todo).build(); + } + + @GET + @Path("/completed") + public Response getCompletedTodos(@Context SecurityContext securityContext) { + String username = securityContext.getUserPrincipal().getName(); + List todos = todoDAO.getCompletedTodosByUsername(username); + return Response.ok(todos).build(); + } + + @GET + @Path("/incomplete") + public Response getIncompleteTodos(@Context SecurityContext securityContext) { + String username = securityContext.getUserPrincipal().getName(); + List todos = todoDAO.getIncompleteTodosByUsername(username); + return Response.ok(todos).build(); + } + + @POST + public Response createTodo(Todo todo, @Context SecurityContext securityContext) { + String username = securityContext.getUserPrincipal().getName(); + todo = todoDAO.saveTodo(todo, username); + return Response.status(Response.Status.CREATED).entity(todo).build(); + } + + @PUT + @Path("/{id}") + public Response updateTodo(@PathParam("id") Long id, Todo updatedTodo, @Context SecurityContext securityContext) { + String username = securityContext.getUserPrincipal().getName(); + Todo existingTodo = todoDAO.getTodoById(id); + + if (existingTodo == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + + // Sicherheitscheck: Nutzer darf nur eigene Todos aktualisieren + if (!existingTodo.getUser().getUsername().equals(username)) { + return Response.status(Response.Status.FORBIDDEN).build(); + } + + // ID und Benutzer beibehalten + updatedTodo.setId(id); + updatedTodo.setUser(existingTodo.getUser()); + + todoDAO.updateTodo(updatedTodo); + return Response.ok(updatedTodo).build(); + } + + @DELETE + @Path("/{id}") + public Response deleteTodo(@PathParam("id") Long id, @Context SecurityContext securityContext) { + String username = securityContext.getUserPrincipal().getName(); + Todo todo = todoDAO.getTodoById(id); + + if (todo == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + + // Sicherheitscheck: Nutzer darf nur eigene Todos löschen + if (!todo.getUser().getUsername().equals(username)) { + return Response.status(Response.Status.FORBIDDEN).build(); + } + + boolean deleted = todoDAO.deleteTodo(id); + return deleted ? Response.noContent().build() : Response.status(Response.Status.NOT_FOUND).build(); + } + + @PUT + @Path("/{id}/complete") + public Response markTodoComplete(@PathParam("id") Long id, @Context SecurityContext securityContext) { + String username = securityContext.getUserPrincipal().getName(); + Todo todo = todoDAO.getTodoById(id); + + if (todo == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + + // Sicherheitscheck: Nutzer darf nur eigene Todos aktualisieren + if (!todo.getUser().getUsername().equals(username)) { + return Response.status(Response.Status.FORBIDDEN).build(); + } + + todo.setCompleted(true); + todoDAO.updateTodo(todo); + return Response.ok(todo).build(); + } +} diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/security/BasicAuthenticationFilter.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/security/BasicAuthenticationFilter.java new file mode 100644 index 0000000..6d4f104 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/security/BasicAuthenticationFilter.java @@ -0,0 +1,104 @@ +package com.todoapp.security; + +import com.todoapp.dao.UserDAO; +import com.todoapp.model.User; +import jakarta.annotation.Priority; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.Priorities; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.SecurityContext; +import jakarta.ws.rs.ext.Provider; +import java.io.IOException; +import java.security.Principal; +import java.util.Base64; +import at.favre.lib.crypto.bcrypt.BCrypt; + +@Provider +@Priority(Priorities.AUTHENTICATION) +@ApplicationScoped +public class BasicAuthenticationFilter implements ContainerRequestFilter { + + @Inject + private UserDAO userDAO; + + @Override + public void filter(ContainerRequestContext requestContext) throws IOException { + System.out.println("BasicAuthenticationFilter triggered for path: " + requestContext.getUriInfo().getPath()); + String path = requestContext.getUriInfo().getPath(); + if (path.endsWith("auth/register") || path.endsWith("auth/login")) { + return; + } + + String authHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); + if (authHeader == null || !authHeader.startsWith("Basic ")) { + abortWithUnauthorized(requestContext); + return; + } + + String[] credentials = extractCredentials(authHeader); + if (credentials.length != 2) { + abortWithUnauthorized(requestContext); + return; + } + + String username = credentials[0]; + String password = credentials[1]; + + User user = userDAO.getUserByUsername(username); + if (user == null) { + abortWithUnauthorized(requestContext); + return; + } + + BCrypt.Result result = BCrypt.verifyer() + .verify(password.toCharArray(), user.getPassword()); + if (!result.verified) { + abortWithUnauthorized(requestContext); + return; + } + + final SecurityContext currentSecurityContext = requestContext.getSecurityContext(); + requestContext.setSecurityContext(new SecurityContext() { + @Override + public Principal getUserPrincipal() { + return () -> username; + } + + @Override + public boolean isUserInRole(String role) { + return true; + } + + @Override + public boolean isSecure() { + return currentSecurityContext.isSecure(); + } + + @Override + public String getAuthenticationScheme() { + return "BASIC"; + } + }); + System.out.println("SecurityContext gesetzt für User: " + username); + System.out.println("User in Rolle user: " + requestContext.getSecurityContext().isUserInRole("user")); + + } + + private String[] extractCredentials(String authHeader) { + String base64Credentials = authHeader.substring("Basic ".length()).trim(); + byte[] decoded = Base64.getDecoder().decode(base64Credentials); + String credentials = new String(decoded); + return credentials.split(":", 2); + } + + private void abortWithUnauthorized(ContainerRequestContext requestContext) { + requestContext.abortWith(Response + .status(Response.Status.UNAUTHORIZED) + .header(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"TodoApp\"") + .build()); + } +} diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/security/CORSFilter.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/security/CORSFilter.java new file mode 100644 index 0000000..b08586a --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/security/CORSFilter.java @@ -0,0 +1,20 @@ +package com.todoapp.security; + +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerResponseContext; +import jakarta.ws.rs.container.ContainerResponseFilter; +import jakarta.ws.rs.ext.Provider; +import java.io.IOException; + +@Provider +public class CORSFilter implements ContainerResponseFilter { + + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) + throws IOException { + responseContext.getHeaders().add("Access-Control-Allow-Origin", "*"); + responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); + responseContext.getHeaders().add("Access-Control-Allow-Headers", "Content-Type, Authorization"); + responseContext.getHeaders().add("Access-Control-Max-Age", "86400"); + } +} diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/util/HibernateUtil.java b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/util/HibernateUtil.java new file mode 100644 index 0000000..2ddaaf2 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/java/com/todoapp/util/HibernateUtil.java @@ -0,0 +1,41 @@ +package com.todoapp.util; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Produces; +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; + +@ApplicationScoped +public class HibernateUtil { + + private static SessionFactory sessionFactory; + + @Produces + @ApplicationScoped + public 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 void shutdown() { + if (sessionFactory != null) { + sessionFactory.close(); + } + } +} diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/liberty/config/server.xml b/cmd/jws/projects/jakarta-rest-todo/src/main/liberty/config/server.xml new file mode 100644 index 0000000..f281c16 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/liberty/config/server.xml @@ -0,0 +1,39 @@ + + + + + servlet-6.0 + pages-3.1 + jdbc-4.2 + jndi-1.0 + monitor-1.0 + restfulWS-3.1 + jsonb-3.0 + jsonp-2.1 + + transportSecurity-1.0 + + + + + + + + + + + + + + + + + + + diff --git a/cmd/jws/projects/jakarta-rest-todo/src/main/resources/META-INF/persistence.xml b/cmd/jws/projects/jakarta-rest-todo/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..1e6b316 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-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-rest-todo/src/main/resources/hibernate.cfg.xml b/cmd/jws/projects/jakarta-rest-todo/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000..33bdd20 --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-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-rest-todo/src/main/webapp/WEB-INF/web.xml b/cmd/jws/projects/jakarta-rest-todo/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..80ab99b --- /dev/null +++ b/cmd/jws/projects/jakarta-rest-todo/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,12 @@ + + + + Todo Application + + + 30 + + From 83ffeb107fe97a396c30f62f0c1374ce1e8ba695 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Sun, 23 Mar 2025 03:00:14 +0100 Subject: [PATCH 15/38] feat: added complete example for spring boot rest service with devcontainer --- .../.devcontainer/.dockerignore | 8 + .../spring-boot-todo/.devcontainer/.gitignore | 27 ++ .../.devcontainer/Dockerfile.dev | 15 + .../.devcontainer/devcontainer.json | 15 + .../.devcontainer/docker-compose.yml | 39 +++ .../spring-boot-todo/.devcontainer/init.sql | 19 ++ cmd/jws/projects/spring-boot-todo/Dockerfile | 24 -- .../projects/spring-boot-todo/compose.yaml | 36 --- cmd/jws/projects/spring-boot-todo/mvnw | 259 ------------------ cmd/jws/projects/spring-boot-todo/mvnw.cmd | 149 ---------- cmd/jws/projects/spring-boot-todo/pom.xml | 144 ++++++---- .../todo_spring/TodoSpringApplication.java | 13 - .../controllers/TaskController.java | 50 ---- .../com/example/todo_spring/models/Task.java | 46 ---- .../repositories/TaskRepository.java | 20 -- .../todo_spring/services/TaskService.java | 47 ---- .../java/com/todoapp/TodoAppApplication.java | 12 + .../todoapp/controller/AuthController.java | 91 ++++++ .../todoapp/controller/TodoController.java | 144 ++++++++++ .../java/com/todoapp/dto/LoginRequest.java | 23 ++ .../com/todoapp/dto/RegistrationRequest.java | 32 +++ .../src/main/java/com/todoapp/model/Todo.java | 109 ++++++++ .../src/main/java/com/todoapp/model/User.java | 101 +++++++ .../todoapp/repository/TodoRepository.java | 13 + .../todoapp/repository/UserRepository.java | 13 + .../com/todoapp/security/SecurityConfig.java | 66 +++++ .../security/UserDetailsServiceImpl.java | 33 +++ .../java/com/todoapp/service/TodoService.java | 65 +++++ .../java/com/todoapp/service/UserService.java | 55 ++++ .../main/resources/META-INF/persistence.xml | 20 ++ .../src/main/resources/application.properties | 33 ++- .../src/main/resources/hibernate.cfg.xml | 26 ++ .../src/main/resources/schema.sql | 0 33 files changed, 1030 insertions(+), 717 deletions(-) create mode 100644 cmd/jws/projects/spring-boot-todo/.devcontainer/.dockerignore create mode 100644 cmd/jws/projects/spring-boot-todo/.devcontainer/.gitignore create mode 100644 cmd/jws/projects/spring-boot-todo/.devcontainer/Dockerfile.dev create mode 100644 cmd/jws/projects/spring-boot-todo/.devcontainer/devcontainer.json create mode 100644 cmd/jws/projects/spring-boot-todo/.devcontainer/docker-compose.yml create mode 100644 cmd/jws/projects/spring-boot-todo/.devcontainer/init.sql delete mode 100644 cmd/jws/projects/spring-boot-todo/Dockerfile delete mode 100644 cmd/jws/projects/spring-boot-todo/compose.yaml delete mode 100755 cmd/jws/projects/spring-boot-todo/mvnw delete mode 100644 cmd/jws/projects/spring-boot-todo/mvnw.cmd delete mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/TodoSpringApplication.java delete mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/controllers/TaskController.java delete mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/models/Task.java delete mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/repositories/TaskRepository.java delete mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/services/TaskService.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/TodoAppApplication.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/controller/AuthController.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/controller/TodoController.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/dto/LoginRequest.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/dto/RegistrationRequest.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/model/Todo.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/model/User.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/repository/TodoRepository.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/repository/UserRepository.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/security/SecurityConfig.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/security/UserDetailsServiceImpl.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/service/TodoService.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/service/UserService.java create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/resources/META-INF/persistence.xml create mode 100644 cmd/jws/projects/spring-boot-todo/src/main/resources/hibernate.cfg.xml delete mode 100644 cmd/jws/projects/spring-boot-todo/src/main/resources/schema.sql diff --git a/cmd/jws/projects/spring-boot-todo/.devcontainer/.dockerignore b/cmd/jws/projects/spring-boot-todo/.devcontainer/.dockerignore new file mode 100644 index 0000000..017b280 --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/.devcontainer/.dockerignore @@ -0,0 +1,8 @@ +.git +.github +.settings +target +*.iml +.idea +.vscode +node_modules diff --git a/cmd/jws/projects/spring-boot-todo/.devcontainer/.gitignore b/cmd/jws/projects/spring-boot-todo/.devcontainer/.gitignore new file mode 100644 index 0000000..82b069a --- /dev/null +++ b/cmd/jws/projects/spring-boot-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/spring-boot-todo/.devcontainer/Dockerfile.dev b/cmd/jws/projects/spring-boot-todo/.devcontainer/Dockerfile.dev new file mode 100644 index 0000000..4fc5dbe --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/.devcontainer/Dockerfile.dev @@ -0,0 +1,15 @@ +FROM mcr.microsoft.com/devcontainers/java:1-21-bullseye + +RUN apt-get update && apt-get install -y curl maven + +RUN 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 + +WORKDIR /app + +COPY . . + +RUN mvn clean install -DskipTests + +CMD ["mvn", "spring-boot:run"] + diff --git a/cmd/jws/projects/spring-boot-todo/.devcontainer/devcontainer.json b/cmd/jws/projects/spring-boot-todo/.devcontainer/devcontainer.json new file mode 100644 index 0000000..49af787 --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/.devcontainer/devcontainer.json @@ -0,0 +1,15 @@ +{ + "name": "Java & PostgreSQL", + "dockerComposeFile": "docker-compose.yml", + "service": "app", + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", + "forwardPorts": [9080, 5432], + "postCreateCommand": "mvn clean install -DskipTests", + "remoteUser": "vscode", + "features": { + "ghcr.io/devcontainers-extra/features/maven-sdkman:2": { + "version": "latest" + }, + "ghcr.io/devcontainers/features/git:1": { "version": "latest" } + } +} diff --git a/cmd/jws/projects/spring-boot-todo/.devcontainer/docker-compose.yml b/cmd/jws/projects/spring-boot-todo/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..c7078c7 --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/.devcontainer/docker-compose.yml @@ -0,0 +1,39 @@ +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 + + 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/spring-boot-todo/.devcontainer/init.sql b/cmd/jws/projects/spring-boot-todo/.devcontainer/init.sql new file mode 100644 index 0000000..818eadb --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/.devcontainer/init.sql @@ -0,0 +1,19 @@ +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) +); + +INSERT INTO users (username, password, email) VALUES +('test', '$2a$12$nt7xQKNDKZhxQFZGD5Wy0.Uh0wdPtWDgwfnWnPLgBWnQDGGkNLKBi', 'test@example.com'); diff --git a/cmd/jws/projects/spring-boot-todo/Dockerfile b/cmd/jws/projects/spring-boot-todo/Dockerfile deleted file mode 100644 index f002fa2..0000000 --- a/cmd/jws/projects/spring-boot-todo/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM maven:3.9-eclipse-temurin-17 as builder - -WORKDIR /app -COPY . . -# RUN mvn clean package - -# Baue die Anwendung mit Maven -RUN mvn clean install -DskipTests - -# Verwende ein schlankes OpenJDK-Image für die Ausführung -FROM openjdk:17-jdk-slim - -# Setze das Arbeitsverzeichnis im Container -WORKDIR /app - -# Kopiere die JAR-Datei aus dem Builder-Image -COPY --from=builder /app/target/*.jar app.jar - -# Mache Port 8080 im Container verfügbar (oder den Port, den deine Anwendung verwendet) -EXPOSE 8090 - -# Definiere den Befehl zum Ausführen der Anwendung -ENTRYPOINT ["java", "-jar", "app.jar"] - diff --git a/cmd/jws/projects/spring-boot-todo/compose.yaml b/cmd/jws/projects/spring-boot-todo/compose.yaml deleted file mode 100644 index 02856b5..0000000 --- a/cmd/jws/projects/spring-boot-todo/compose.yaml +++ /dev/null @@ -1,36 +0,0 @@ -version: "3.8" -services: - db: - image: postgres:latest - container_name: todolist-db - restart: unless-stopped - environment: - POSTGRES_DB: todolist - POSTGRES_USER: myuser - POSTGRES_PASSWORD: mypassword - ports: - - "5432:5432" - volumes: - - db_data:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U myuser -d todolist"] - interval: 10s - timeout: 5s - retries: 5 - - app: - build: . - container_name: todo-spring-app - ports: - - "8090:8090" - depends_on: - db: - condition: service_healthy - environment: - SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/todolist - SPRING_DATASOURCE_USERNAME: myuser - SPRING_DATASOURCE_PASSWORD: mypassword - restart: unless-stopped - -volumes: - db_data: diff --git a/cmd/jws/projects/spring-boot-todo/mvnw b/cmd/jws/projects/spring-boot-todo/mvnw deleted file mode 100755 index 19529dd..0000000 --- a/cmd/jws/projects/spring-boot-todo/mvnw +++ /dev/null @@ -1,259 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.3.2 -# -# Optional ENV vars -# ----------------- -# JAVA_HOME - location of a JDK home dir, required when download maven via java source -# MVNW_REPOURL - repo url base for downloading maven distribution -# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven -# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output -# ---------------------------------------------------------------------------- - -set -euf -[ "${MVNW_VERBOSE-}" != debug ] || set -x - -# OS specific support. -native_path() { printf %s\\n "$1"; } -case "$(uname)" in -CYGWIN* | MINGW*) - [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" - native_path() { cygpath --path --windows "$1"; } - ;; -esac - -# set JAVACMD and JAVACCMD -set_java_home() { - # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched - if [ -n "${JAVA_HOME-}" ]; then - if [ -x "$JAVA_HOME/jre/sh/java" ]; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - JAVACCMD="$JAVA_HOME/jre/sh/javac" - else - JAVACMD="$JAVA_HOME/bin/java" - JAVACCMD="$JAVA_HOME/bin/javac" - - if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then - echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 - echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 - return 1 - fi - fi - else - JAVACMD="$( - 'set' +e - 'unset' -f command 2>/dev/null - 'command' -v java - )" || : - JAVACCMD="$( - 'set' +e - 'unset' -f command 2>/dev/null - 'command' -v javac - )" || : - - if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then - echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 - return 1 - fi - fi -} - -# hash string like Java String::hashCode -hash_string() { - str="${1:-}" h=0 - while [ -n "$str" ]; do - char="${str%"${str#?}"}" - h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) - str="${str#?}" - done - printf %x\\n $h -} - -verbose() { :; } -[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } - -die() { - printf %s\\n "$1" >&2 - exit 1 -} - -trim() { - # MWRAPPER-139: - # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. - # Needed for removing poorly interpreted newline sequences when running in more - # exotic environments such as mingw bash on Windows. - printf "%s" "${1}" | tr -d '[:space:]' -} - -# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties -while IFS="=" read -r key value; do - case "${key-}" in - distributionUrl) distributionUrl=$(trim "${value-}") ;; - distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; - esac -done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" -[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" - -case "${distributionUrl##*/}" in -maven-mvnd-*bin.*) - MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ - case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in - *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; - :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; - :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; - :Linux*x86_64*) distributionPlatform=linux-amd64 ;; - *) - echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 - distributionPlatform=linux-amd64 - ;; - esac - distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" - ;; -maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; -*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; -esac - -# apply MVNW_REPOURL and calculate MAVEN_HOME -# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ -[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" -distributionUrlName="${distributionUrl##*/}" -distributionUrlNameMain="${distributionUrlName%.*}" -distributionUrlNameMain="${distributionUrlNameMain%-bin}" -MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" -MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" - -exec_maven() { - unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : - exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" -} - -if [ -d "$MAVEN_HOME" ]; then - verbose "found existing MAVEN_HOME at $MAVEN_HOME" - exec_maven "$@" -fi - -case "${distributionUrl-}" in -*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; -*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; -esac - -# prepare tmp dir -if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then - clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } - trap clean HUP INT TERM EXIT -else - die "cannot create temp dir" -fi - -mkdir -p -- "${MAVEN_HOME%/*}" - -# Download and Install Apache Maven -verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." -verbose "Downloading from: $distributionUrl" -verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" - -# select .zip or .tar.gz -if ! command -v unzip >/dev/null; then - distributionUrl="${distributionUrl%.zip}.tar.gz" - distributionUrlName="${distributionUrl##*/}" -fi - -# verbose opt -__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' -[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v - -# normalize http auth -case "${MVNW_PASSWORD:+has-password}" in -'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; -has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; -esac - -if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then - verbose "Found wget ... using wget" - wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" -elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then - verbose "Found curl ... using curl" - curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" -elif set_java_home; then - verbose "Falling back to use Java to download" - javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" - targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" - cat >"$javaSource" <<-END - public class Downloader extends java.net.Authenticator - { - protected java.net.PasswordAuthentication getPasswordAuthentication() - { - return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); - } - public static void main( String[] args ) throws Exception - { - setDefault( new Downloader() ); - java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); - } - } - END - # For Cygwin/MinGW, switch paths to Windows format before running javac and java - verbose " - Compiling Downloader.java ..." - "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" - verbose " - Running Downloader.java ..." - "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" -fi - -# If specified, validate the SHA-256 sum of the Maven distribution zip file -if [ -n "${distributionSha256Sum-}" ]; then - distributionSha256Result=false - if [ "$MVN_CMD" = mvnd.sh ]; then - echo "Checksum validation is not supported for maven-mvnd." >&2 - echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 - exit 1 - elif command -v sha256sum >/dev/null; then - if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then - distributionSha256Result=true - fi - elif command -v shasum >/dev/null; then - if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then - distributionSha256Result=true - fi - else - echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 - echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 - exit 1 - fi - if [ $distributionSha256Result = false ]; then - echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 - echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 - exit 1 - fi -fi - -# unzip and move -if command -v unzip >/dev/null; then - unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" -else - tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" -fi -printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" -mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" - -clean || : -exec_maven "$@" diff --git a/cmd/jws/projects/spring-boot-todo/mvnw.cmd b/cmd/jws/projects/spring-boot-todo/mvnw.cmd deleted file mode 100644 index 249bdf3..0000000 --- a/cmd/jws/projects/spring-boot-todo/mvnw.cmd +++ /dev/null @@ -1,149 +0,0 @@ -<# : batch portion -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.3.2 -@REM -@REM Optional ENV vars -@REM MVNW_REPOURL - repo url base for downloading maven distribution -@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven -@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output -@REM ---------------------------------------------------------------------------- - -@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) -@SET __MVNW_CMD__= -@SET __MVNW_ERROR__= -@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% -@SET PSModulePath= -@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( - IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) -) -@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% -@SET __MVNW_PSMODULEP_SAVE= -@SET __MVNW_ARG0_NAME__= -@SET MVNW_USERNAME= -@SET MVNW_PASSWORD= -@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) -@echo Cannot start maven from wrapper >&2 && exit /b 1 -@GOTO :EOF -: end batch / begin powershell #> - -$ErrorActionPreference = "Stop" -if ($env:MVNW_VERBOSE -eq "true") { - $VerbosePreference = "Continue" -} - -# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties -$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl -if (!$distributionUrl) { - Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" -} - -switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { - "maven-mvnd-*" { - $USE_MVND = $true - $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" - $MVN_CMD = "mvnd.cmd" - break - } - default { - $USE_MVND = $false - $MVN_CMD = $script -replace '^mvnw','mvn' - break - } -} - -# apply MVNW_REPOURL and calculate MAVEN_HOME -# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ -if ($env:MVNW_REPOURL) { - $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } - $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" -} -$distributionUrlName = $distributionUrl -replace '^.*/','' -$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' -$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" -if ($env:MAVEN_USER_HOME) { - $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" -} -$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' -$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" - -if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { - Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" - Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" - exit $? -} - -if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { - Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" -} - -# prepare tmp dir -$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile -$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" -$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null -trap { - if ($TMP_DOWNLOAD_DIR.Exists) { - try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } - catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } - } -} - -New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null - -# Download and Install Apache Maven -Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." -Write-Verbose "Downloading from: $distributionUrl" -Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" - -$webclient = New-Object System.Net.WebClient -if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { - $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) -} -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null - -# If specified, validate the SHA-256 sum of the Maven distribution zip file -$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum -if ($distributionSha256Sum) { - if ($USE_MVND) { - Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." - } - Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash - if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { - Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." - } -} - -# unzip and move -Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null -Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null -try { - Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null -} catch { - if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { - Write-Error "fail to move MAVEN_HOME" - } -} finally { - try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } - catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } -} - -Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/cmd/jws/projects/spring-boot-todo/pom.xml b/cmd/jws/projects/spring-boot-todo/pom.xml index d8de2b7..a490b5c 100644 --- a/cmd/jws/projects/spring-boot-todo/pom.xml +++ b/cmd/jws/projects/spring-boot-todo/pom.xml @@ -1,63 +1,87 @@ - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.4.3 - - - com.example - todo-spring - 0.0.1-SNAPSHOT - todo-spring - Demo Todo App for Spring Boot - - - - - - - - - - - - - - - 17 - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - - - - org.postgresql - postgresql - runtime - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.0 + + + com.todoapp + spring-todo-app + 0.0.1-SNAPSHOT + spring-todo-app + Spring Boot Todo App + + + 17 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + org.springframework.boot + spring-boot-starter-security + + + + + org.postgresql + postgresql + runtime + + + + + at.favre.lib + bcrypt + 0.10.2 + + + + + org.springframework.boot + spring-boot-starter-json + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/TodoSpringApplication.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/TodoSpringApplication.java deleted file mode 100644 index d97a5d3..0000000 --- a/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/TodoSpringApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.todo_spring; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class TodoSpringApplication { - - public static void main(String[] args) { - SpringApplication.run(TodoSpringApplication.class, args); - } - -} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/controllers/TaskController.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/controllers/TaskController.java deleted file mode 100644 index c6a7593..0000000 --- a/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/controllers/TaskController.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.example.todo_spring.controllers; - -import com.example.todo_spring.models.Task; -import com.example.todo_spring.services.TaskService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@Controller -@RequestMapping("/api/v1/tasks") -public class TaskController { - - @Autowired - private TaskService taskService; - - @GetMapping("/") - public ResponseEntity> getAllTasks() { - return ResponseEntity.ok(taskService.getAllTask()); - } - - @GetMapping("/completed") - public ResponseEntity> getAllCompletedTasks() { - return ResponseEntity.ok(taskService.findAllCompletedTask()); - } - - @GetMapping("/incomplete") - public ResponseEntity> getAllIncompleteTasks() { - return ResponseEntity.ok(taskService.findAllInCompleteTask()); - } - - @PostMapping("/") - public ResponseEntity createTask(@RequestBody Task task) { - return ResponseEntity.ok(taskService.createNewTask(task)); - } - - @PutMapping("/{id}") - public ResponseEntity updateTask(@PathVariable Long id, @RequestBody Task task) { - task.setId(id); - return ResponseEntity.ok(taskService.updateTask(task)); - } - - @DeleteMapping("/{id}") - public ResponseEntity getAllTasks(@PathVariable Long id) { - taskService.deleteTaskById(id); - return ResponseEntity.ok(true); - } -} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/models/Task.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/models/Task.java deleted file mode 100644 index a2565e6..0000000 --- a/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/models/Task.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.example.todo_spring.models; - -import jakarta.persistence.*; - -@Entity -public class Task { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private String task; - private boolean completed; - - public Task(String task, boolean completed) { - this.task = task; - this.completed = completed; - } - - public Task() { - this.task = ""; - this.completed = false; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTask() { - return task; - } - - public void setTask(String task) { - this.task = task; - } - - public boolean isCompleted() { - return completed; - } - - public void setCompleted(boolean completed) { - this.completed = completed; - } -} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/repositories/TaskRepository.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/repositories/TaskRepository.java deleted file mode 100644 index be73235..0000000 --- a/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/repositories/TaskRepository.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.example.todo_spring.repositories; - -import com.example.todo_spring.models.Task; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface TaskRepository extends JpaRepository { - public Task findByTask(String task); - - public List findByCompletedTrue(); - - public List findByCompletedFalse(); - - public List findAll(); - - public Task getById(Long id); -} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/services/TaskService.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/services/TaskService.java deleted file mode 100644 index aff11a1..0000000 --- a/cmd/jws/projects/spring-boot-todo/src/main/java/com/example/todo_spring/services/TaskService.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.example.todo_spring.services; - -import com.example.todo_spring.models.Task; -import com.example.todo_spring.repositories.TaskRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class TaskService { - @Autowired - private TaskRepository taskRepository; - - public Task createNewTask(Task task) { - return taskRepository.save(task); - } - - public List getAllTask() { - return taskRepository.findAll(); - } - - public Task findTaskById(Long id) { - return taskRepository.getById(id); - } - - public List findAllCompletedTask() { - return taskRepository.findByCompletedTrue(); - } - - public List findAllInCompleteTask() { - return taskRepository.findByCompletedFalse(); - } - - public void deleteTask(Task task) { - taskRepository.delete(task); - } - - public void deleteTaskById(Long id) { - Task task = taskRepository.getById(id); - taskRepository.delete(task); - } - - public Task updateTask(Task task) { - return taskRepository.save(task); - } -} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/TodoAppApplication.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/TodoAppApplication.java new file mode 100644 index 0000000..b356f72 --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/TodoAppApplication.java @@ -0,0 +1,12 @@ +package com.todoapp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TodoAppApplication { + + public static void main(String[] args) { + SpringApplication.run(TodoAppApplication.class, args); + } +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/controller/AuthController.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/controller/AuthController.java new file mode 100644 index 0000000..29dcd72 --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/controller/AuthController.java @@ -0,0 +1,91 @@ +package com.todoapp.controller; + +import com.todoapp.dto.LoginRequest; +import com.todoapp.dto.RegistrationRequest; +import com.todoapp.model.User; +import com.todoapp.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/api/auth") +public class AuthController { + + private final UserService userService; + private final AuthenticationManager authenticationManager; + + @Autowired + public AuthController(UserService userService, AuthenticationManager authenticationManager) { + this.userService = userService; + this.authenticationManager = authenticationManager; + } + + @PostMapping("/register") + public ResponseEntity register(@RequestBody RegistrationRequest request) { + if (request.getUsername() == null || request.getPassword() == null || request.getEmail() == null) { + Map response = new HashMap<>(); + response.put("error", "Username, password, and email are required"); + return ResponseEntity.badRequest().body(response); + } + + if (userService.usernameExists(request.getUsername())) { + Map response = new HashMap<>(); + response.put("error", "Username already exists"); + return ResponseEntity.status(HttpStatus.CONFLICT).body(response); + } + + if (userService.emailExists(request.getEmail())) { + Map response = new HashMap<>(); + response.put("error", "Email already exists"); + return ResponseEntity.status(HttpStatus.CONFLICT).body(response); + } + + User user = new User(request.getUsername(), request.getPassword(), request.getEmail()); + userService.saveUser(user); + + Map response = new HashMap<>(); + response.put("message", "User registered successfully"); + return ResponseEntity.status(HttpStatus.CREATED).body(response); + } + + @PostMapping("/login") + public ResponseEntity login(@RequestBody LoginRequest request) { + if (request.getUsername() == null || request.getPassword() == null) { + Map response = new HashMap<>(); + response.put("error", "Username and password are required"); + return ResponseEntity.badRequest().body(response); + } + + try { + Authentication authentication = authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword())); + + SecurityContextHolder.getContext().setAuthentication(authentication); + + User user = userService.getUserByUsername(request.getUsername()) + .orElseThrow(() -> new RuntimeException("User not found")); + + Map response = new HashMap<>(); + response.put("message", "Login successful"); + response.put("username", user.getUsername()); + response.put("email", user.getEmail()); + + return ResponseEntity.ok(response); + } catch (Exception e) { + Map response = new HashMap<>(); + response.put("error", "Invalid credentials"); + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(response); + } + } +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/controller/TodoController.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/controller/TodoController.java new file mode 100644 index 0000000..2cdb7aa --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/controller/TodoController.java @@ -0,0 +1,144 @@ +package com.todoapp.controller; + +import com.todoapp.model.Todo; +import com.todoapp.service.TodoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.Optional; + +@RestController +@RequestMapping("/api/todos") +public class TodoController { + + private final TodoService todoService; + + @Autowired + public TodoController(TodoService todoService) { + this.todoService = todoService; + } + + @GetMapping + public ResponseEntity> getAllTodos(Authentication authentication) { + String username = authentication.getName(); + List todos = todoService.getTodosByUsername(username); + return ResponseEntity.ok(todos); + } + + @GetMapping("/{id}") + public ResponseEntity getTodoById(@PathVariable("id") Long id, Authentication authentication) { + String username = authentication.getName(); + Optional todoOptional = todoService.getTodoById(id); + if (todoOptional.isPresent()) { + Todo todo = todoOptional.get(); + if (!todo.getUser().getUsername().equals(username)) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + return ResponseEntity.ok(todo); + } else { + return ResponseEntity.notFound().build(); + } + } + + @GetMapping("/completed") + public ResponseEntity> getCompletedTodos(Authentication authentication) { + String username = authentication.getName(); + List todos = todoService.getCompletedTodosByUsername(username); + return ResponseEntity.ok(todos); + } + + @GetMapping("/incomplete") + public ResponseEntity> getIncompleteTodos(Authentication authentication) { + String username = authentication.getName(); + List todos = todoService.getIncompleteTodosByUsername(username); + return ResponseEntity.ok(todos); + } + + @PostMapping + public ResponseEntity createTodo(@RequestBody Todo todo, Authentication authentication) { + String username = authentication.getName(); + Todo savedTodo = todoService.saveTodo(todo, username); + return ResponseEntity.status(HttpStatus.CREATED).body(savedTodo); + } + + @PutMapping("/{id}") + public ResponseEntity updateTodo(@PathVariable("id") Long id, @RequestBody Todo updatedTodo, + Authentication authentication) { + String username = authentication.getName(); + + Optional existingTodoOptional = todoService.getTodoById(id); + + if (existingTodoOptional.isPresent()) { + Todo existingTodo = existingTodoOptional.get(); + + if (!existingTodo.getUser().getUsername().equals(username)) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + + updatedTodo.setId(id); + updatedTodo.setUser(existingTodo.getUser()); + + Optional updatedTodoOptional = todoService.updateTodo(updatedTodo); + if (updatedTodoOptional.isPresent()) { + return ResponseEntity.ok(updatedTodoOptional.get()); + } else { + return ResponseEntity.notFound().build(); + } + } else { + return ResponseEntity.notFound().build(); + } + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteTodo(@PathVariable("id") Long id, Authentication authentication) { + String username = authentication.getName(); + + Optional todoOptional = todoService.getTodoById(id); + + if (todoOptional.isPresent()) { + Todo todo = todoOptional.get(); + + if (!todo.getUser().getUsername().equals(username)) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + + boolean isDeleted = todoService.deleteTodo(id); + if (isDeleted) { + return ResponseEntity.noContent().build(); + } else { + return ResponseEntity.notFound().build(); + } + } else { + return ResponseEntity.notFound().build(); + } + } + + @PutMapping("/{id}/complete") + public ResponseEntity markTodoComplete(@PathVariable("id") Long id, Authentication authentication) { + String username = authentication.getName(); + + Optional todoOptional = todoService.getTodoById(id); + + if (todoOptional.isPresent()) { + Todo todo = todoOptional.get(); + + if (!todo.getUser().getUsername().equals(username)) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + + todo.setCompleted(true); + + Optional updatedTodoOptional = todoService.updateTodo(todo); + if (updatedTodoOptional.isPresent()) { + return ResponseEntity.ok(updatedTodoOptional.get()); + } else { + return ResponseEntity.notFound().build(); + } + } else { + return ResponseEntity.notFound().build(); + } + } +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/dto/LoginRequest.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/dto/LoginRequest.java new file mode 100644 index 0000000..5608a6e --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/dto/LoginRequest.java @@ -0,0 +1,23 @@ +package com.todoapp.dto; + +public class LoginRequest { + private String username; + private String password; + + // Getter und Setter + 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; + } +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/dto/RegistrationRequest.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/dto/RegistrationRequest.java new file mode 100644 index 0000000..04561ec --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/dto/RegistrationRequest.java @@ -0,0 +1,32 @@ +package com.todoapp.dto; + +public class RegistrationRequest { + private String username; + private String password; + private String email; + + // Getter und Setter + 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; + } +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/model/Todo.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/model/Todo.java new file mode 100644 index 0000000..0abf071 --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/model/Todo.java @@ -0,0 +1,109 @@ +package com.todoapp.model; + +import jakarta.persistence.*; +import com.fasterxml.jackson.annotation.JsonIgnore; +import java.io.Serializable; +import java.util.Date; + +@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") + @Temporal(TemporalType.DATE) + private Date targetDate; + + @Column + private boolean completed; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + @JsonIgnore + private User user; + + // Konstruktoren + public Todo() { + } + + public Todo(String title, String description, Date 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 Date getTargetDate() { + return targetDate; + } + + public void setTargetDate(Date 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; + } + + // Zusätzliche Methode für REST-Antworten + public Long getUserId() { + return user != null ? user.getId() : null; + } + + @Override + public String toString() { + return "Todo{" + + "id=" + id + + ", title='" + title + '\'' + + ", description='" + description + '\'' + + ", targetDate=" + targetDate + + ", completed=" + completed + + '}'; + } +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/model/User.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/model/User.java new file mode 100644 index 0000000..9af8c5c --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/model/User.java @@ -0,0 +1,101 @@ +package com.todoapp.model; + +import jakarta.persistence.*; +import com.fasterxml.jackson.annotation.JsonIgnore; +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) + @JsonIgnore // Verhindert, dass das Passwort in JSON serialisiert wird + private String password; + + @Column(nullable = false) + private String email; + + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonIgnore + 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/spring-boot-todo/src/main/java/com/todoapp/repository/TodoRepository.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/repository/TodoRepository.java new file mode 100644 index 0000000..d6c229e --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/repository/TodoRepository.java @@ -0,0 +1,13 @@ +package com.todoapp.repository; + +import com.todoapp.model.Todo; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +public interface TodoRepository extends JpaRepository { + List findByUserUsernameOrderByCompletedAscTargetDateAsc(String username); + + List findByUserUsernameAndCompletedTrue(String username); + + List findByUserUsernameAndCompletedFalseOrderByTargetDateAsc(String username); +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/repository/UserRepository.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/repository/UserRepository.java new file mode 100644 index 0000000..470532f --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/repository/UserRepository.java @@ -0,0 +1,13 @@ +package com.todoapp.repository; + +import com.todoapp.model.User; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByUsername(String username); + + boolean existsByUsername(String username); + + boolean existsByEmail(String email); +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/security/SecurityConfig.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/security/SecurityConfig.java new file mode 100644 index 0000000..3e9b544 --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/security/SecurityConfig.java @@ -0,0 +1,66 @@ +package com.todoapp.security; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import java.util.Arrays; + +@Configuration +@EnableWebSecurity +public class SecurityConfig { + + @Autowired + private UserDetailsService userDetailsService; + + @Bean + public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception { + return http.getSharedObject(AuthenticationManagerBuilder.class) + .userDetailsService(userDetailsService) + .passwordEncoder(passwordEncoder()) + .and() + .build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http + .csrf().disable() + .cors().and() + .authorizeHttpRequests(auth -> auth + .requestMatchers("/api/auth/register").permitAll() + .requestMatchers("/api/auth/login").permitAll() + .anyRequest().authenticated()) + .httpBasic(); + + return http.build(); + } + + @Bean + public CorsConfigurationSource corsConfigurationSource() { + CorsConfiguration configuration = new CorsConfiguration(); + configuration.setAllowedOrigins(Arrays.asList("*")); + configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); + configuration.setAllowedHeaders(Arrays.asList("Content-Type", "Authorization")); + configuration.setMaxAge(3600L); + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", configuration); + return source; + } +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/security/UserDetailsServiceImpl.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/security/UserDetailsServiceImpl.java new file mode 100644 index 0000000..d821693 --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/security/UserDetailsServiceImpl.java @@ -0,0 +1,33 @@ +package com.todoapp.security; + +import com.todoapp.model.User; +import com.todoapp.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import java.util.Collections; + +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + + private final UserRepository userRepository; + + @Autowired + public UserDetailsServiceImpl(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = userRepository.findByUsername(username) + .orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username)); + + return new org.springframework.security.core.userdetails.User( + user.getUsername(), + user.getPassword(), + Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER"))); + } +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/service/TodoService.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/service/TodoService.java new file mode 100644 index 0000000..0140554 --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/service/TodoService.java @@ -0,0 +1,65 @@ +package com.todoapp.service; + +import com.todoapp.model.Todo; +import com.todoapp.model.User; +import com.todoapp.repository.TodoRepository; +import com.todoapp.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Optional; + +@Service +public class TodoService { + + private final TodoRepository todoRepository; + private final UserRepository userRepository; + + @Autowired + public TodoService(TodoRepository todoRepository, UserRepository userRepository) { + this.todoRepository = todoRepository; + this.userRepository = userRepository; + } + + public Todo saveTodo(Todo todo, String username) { + User user = userRepository.findByUsername(username) + .orElseThrow(() -> new RuntimeException("User not found")); + todo.setUser(user); + return todoRepository.save(todo); + } + + public Optional updateTodo(Todo todo) { + if (todoRepository.existsById(todo.getId())) { + return Optional.of(todoRepository.save(todo)); + } + return Optional.empty(); + } + + public boolean deleteTodo(Long id) { + if (todoRepository.existsById(id)) { + todoRepository.deleteById(id); + return true; + } + return false; + } + + public Optional getTodoById(Long id) { + return todoRepository.findById(id); + } + + public List getAllTodos() { + return todoRepository.findAll(); + } + + public List getTodosByUsername(String username) { + return todoRepository.findByUserUsernameOrderByCompletedAscTargetDateAsc(username); + } + + public List getCompletedTodosByUsername(String username) { + return todoRepository.findByUserUsernameAndCompletedTrue(username); + } + + public List getIncompleteTodosByUsername(String username) { + return todoRepository.findByUserUsernameAndCompletedFalseOrderByTargetDateAsc(username); + } +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/service/UserService.java b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/service/UserService.java new file mode 100644 index 0000000..30cf5ac --- /dev/null +++ b/cmd/jws/projects/spring-boot-todo/src/main/java/com/todoapp/service/UserService.java @@ -0,0 +1,55 @@ +package com.todoapp.service; + +import com.todoapp.model.User; +import com.todoapp.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Optional; + +@Service +public class UserService { + + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; + + @Autowired + public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) { + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + } + + public User saveUser(User user) { + user.setPassword(passwordEncoder.encode(user.getPassword())); + return userRepository.save(user); + } + + public Optional getUserById(Long id) { + return userRepository.findById(id); + } + + public Optional getUserByUsername(String username) { + return userRepository.findByUsername(username); + } + + public List getAllUsers() { + return userRepository.findAll(); + } + + public boolean deleteUser(Long id) { + if (userRepository.existsById(id)) { + userRepository.deleteById(id); + return true; + } + return false; + } + + public boolean usernameExists(String username) { + return userRepository.existsByUsername(username); + } + + public boolean emailExists(String email) { + return userRepository.existsByEmail(email); + } +} diff --git a/cmd/jws/projects/spring-boot-todo/src/main/resources/META-INF/persistence.xml b/cmd/jws/projects/spring-boot-todo/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..1e6b316 --- /dev/null +++ b/cmd/jws/projects/spring-boot-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/spring-boot-todo/src/main/resources/application.properties b/cmd/jws/projects/spring-boot-todo/src/main/resources/application.properties index e52e9af..1228279 100644 --- a/cmd/jws/projects/spring-boot-todo/src/main/resources/application.properties +++ b/cmd/jws/projects/spring-boot-todo/src/main/resources/application.properties @@ -1,14 +1,21 @@ -spring.application.name=todo-spring -spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect -spring.jpa.hibernate.ddl-auto=update -#spring.jpa.hibernate.ddl-auto=none # Entferne oder kommentiere diese Zeile aus -spring.jpa.hibernate.show-sql=true -spring.datasource.url=jdbc:postgresql://localhost:5432/todolist -spring.datasource.username=myuser -spring.datasource.password=mypassword -spring.datasource.initialization-mode=never -#spring.datasource.initialize=true # Entferne oder kommentiere diese Zeile aus -#spring.datasource.schema=classpath:/schema.sql # Entferne oder kommentiere diese Zeile aus -spring.datasource.continue-on-error=true -server.port=8090 +# Datenbankverbindung +spring.datasource.url=jdbc:postgresql://postgresdb:5432/todo_db +spring.datasource.username=postgres +spring.datasource.password=postgres +spring.datasource.driver-class-name=org.postgresql.Driver +# JPA/Hibernate Einstellungen +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.show-sql=true + +# Server-Port +server.port=9080 + +# Logging (optional) +logging.level.org.springframework.web=INFO +logging.level.com.todoapp=DEBUG +logging.level.org.hibernate=ERROR + +# Security Debug (nur für Entwicklung) +logging.level.org.springframework.security=DEBUG diff --git a/cmd/jws/projects/spring-boot-todo/src/main/resources/hibernate.cfg.xml b/cmd/jws/projects/spring-boot-todo/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000..33bdd20 --- /dev/null +++ b/cmd/jws/projects/spring-boot-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/spring-boot-todo/src/main/resources/schema.sql b/cmd/jws/projects/spring-boot-todo/src/main/resources/schema.sql deleted file mode 100644 index e69de29..0000000 From 3abd4a985ad14d2bca7139fc8919f0272358cf4c Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Sun, 23 Mar 2025 03:01:08 +0100 Subject: [PATCH 16/38] docs: update changelog.md --- changelog.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/changelog.md b/changelog.md index 6ea6a71..3040fda 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. +## [0.5.0] - 2025-03-23 + +### 🚀 Features + +- Add jakarta rest todo implementation with devcontainer setup +- Added complete example for spring boot rest service with devcontainer + ## [0.4.0] - 2025-03-21 ### 🚀 Features @@ -13,6 +20,10 @@ All notable changes to this project will be documented in this file. - Add clean up step to build.sh +### 📚 Documentation + +- Update changelog + ## [0.3.0] - 2025-03-21 ### 🚀 Features From 8e48aa6a09ea3973c7a84ad87fdd4eaedf64484a Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Sat, 29 Mar 2025 03:01:34 +0100 Subject: [PATCH 17/38] docs: update README --- README.md | 201 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 136 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index d246114..0652a92 100644 --- a/README.md +++ b/README.md @@ -1,103 +1,174 @@ -# JakartaEE & Spring Boot Starter +# Java Web Starter (JWS) - University Project Environment Initializer -This application is a GUI tool developed in Go using the Fyne framework (v2.5.4). It helps users set up a development environment for JakartaEE and Spring Boot projects by checking and installing necessary dependencies, and then allowing users to deploy starter projects. +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) **Dieses Projekt entstand im Rahmen einer wissenschaftlichen Hausarbeit im Modul "Programmieren von Webanwendungen" an der IU Internationale Hochschule.** -## Features +## Inhaltsverzeichnis -- _Dependency Check_: Verifies the installation of required tools (Visual Studio Code and Docker). +- [Motivation / Problemstellung](#motivation--problemstellung) +- [Lösungsansatz](#lösungsansatz) +- [Kernfunktionen](#kernfunktionen) +- [Technologie-Stack](#technologie-stack) +- [Zielgruppe](#zielgruppe) +- [Installation](#installation) + - [Voraussetzungen](#voraussetzungen) + - [Über Releases (Empfohlen)](#über-releases-empfohlen) + - [Aus dem Quellcode bauen](#aus-dem-quellcode-bauen) +- [Benutzung](#benutzung) +- [Enthaltene Projekt-Templates](#enthaltene-projekt-templates) +- [Funktionsweise (Dev Container)](#funktionsweise-dev-container) +- [Bekannte Probleme / Limitationen](#bekannte-probleme--limitationen) +- [Zukünftige Arbeit / Ausblick](#zukünftige-arbeit--ausblick) +- [Beitragen](#beitragen) +- [Lizenz](#lizenz) +- [Danksagung](#danksagung) -- _Automatic Installation_: Offers to install missing dependencies on supported platforms. +## Motivation / Problemstellung -- _Project Selection_: Provides a list of starter projects for JakartaEE and Spring Boot. +Die Einrichtung adäquater Entwicklungsumgebungen stellt besonders in der Lehre eine signifikante Hürde dar. Studierende nutzen oft heterogene Systeme (Betriebssysteme, installierte Software, Konfigurationen) [source: 9], was häufig zu Kompatibilitätsproblemen, zeitaufwendiger Fehlersuche und dem bekannten „Works on my machine“-Problem führt. Dies verursacht Frustration, erhöht den Betreuungsaufwand und lenkt vom eigentlichen Lerninhalt ab. Besonders bei komplexen Technologie-Stacks, wie sie in der Webentwicklung mit Java (z.B. Jakarta EE, Spring Boot, Datenbanken) üblich sind, ist die manuelle Konfiguration fehleranfällig. -- _Project Deployment_: Allows users to deploy selected projects and open them in Visual Studio Code with dev containers. +## Lösungsansatz -## Prerequisites +Dieses Projekt bietet eine plattformübergreifende Desktop-Anwendung (`jws-Executable`), die den Prozess der Bereitstellung standardisierter Entwicklungsumgebungen für universitäre Java-Webprojekte radikal vereinfacht. Unter Nutzung von **Docker** für die Containerisierung und dem **Dev Container Standard** ermöglicht das Tool Studierenden, mit wenigen Klicks eine vorkonfigurierte, lauffähige und konsistente Umgebung für spezifische Projektvorlagen zu initialisieren. -- Go 1.23 or later +Das Tool wurde in **Go** mit dem **Fyne** GUI-Toolkit entwickelt, um native Ausführbarkeit unter Windows, macOS und Linux zu gewährleisten -- Fyne v2.5.4 +## Kernfunktionen + +- **Plattformübergreifend:** Läuft nativ unter Windows, macOS und Linux. +- **Abhängigkeitsprüfung:** Überprüft automatisch, ob Docker Desktop und Visual Studio Code installiert sind. +- **Automatisierte Installation:** Bietet an, fehlende Abhängigkeiten (Docker Desktop, VS Code) systemabhängig zu installieren: + - **Windows:** Nutzt Winget (prüft auch auf WSL). + - **macOS:** Nutzt Homebrew (installiert Homebrew bei Bedarf). + - **Linux:** Nutzt distributionsspezifische Methoden (dpkg/dnf für VS Code, Docker-Installationsskripte). +- **Template-Auswahl:** Bietet eine Auswahl vordefinierter Starter-Projektvorlagen. +- **Lokales Deployment:** Kopiert die ausgewählten Template-Dateien in ein vom Benutzer gewähltes Verzeichnis. +- **VS Code Integration:** Öffnet das erstellte Projektverzeichnis automatisch in Visual Studio Code. +- **Vorkonfigurierte Umgebungen:** Jedes Template enthält: + - `Dockerfile(s)`: Definiert das Basis-Image mit JDK, Build-Tools etc.. + - `docker-compose.yml`: Definiert die Dienste (App-Container, PostgreSQL-Datenbank, ggf. Runtime-Container wie Open Liberty) und Netzwerke. + - `devcontainer.json`: Konfiguriert VS Code für die Nutzung des Containers, installiert notwendige Extensions (z.B. Java Extension Pack) und richtet Port-Weiterleitungen ein. + - Projekt-Grundgerüst mit vorkonfigurierter Hibernate-Datenbankanbindung. + +## Technologie-Stack + +- **Kernanwendung:** Go, Fyne Toolkit +- **Containerisierung:** Docker, Docker Compose +- **Standardisierung:** Dev Container Standard (`devcontainer.json`) +- **Ziel-IDE:** Visual Studio Code +- **Abhängigkeitsinstallation (Helfer):** Winget (Windows), Homebrew (macOS), Shell-Befehle (Linux) +- **Projekt-Templates:** + - Java Frameworks: Jakarta EE (Servlet/JSP, JSF, REST), Spring Boot (REST) + - Persistenz: Hibernate (JPA) + - Datenbank: PostgreSQL + - Build-Tools: Maven / Gradle (implizit) + +## Zielgruppe + +- **Studierende:** Insbesondere in Informatik- und Wirtschaftsinformatik-Studiengängen, die Java-Webanwendungen programmieren und eine einfache, fehlerfreie Setup-Erfahrung wünschen. +- **Lehrende:** Die ihren Studierenden standardisierte Umgebungen zur Verfügung stellen möchten, um den Support-Aufwand zu reduzieren und die Konzentration auf Lerninhalte zu fördern. ## Installation -### Option 1: Download Pre-built Binary +### Voraussetzungen -Go to the Releases page of this repository. +- Ein unterstütztes Betriebssystem: Windows 10/11, macOS, gängige Linux-Distributionen (getestet unter Mint, Ubuntu, Fedora). +- Administratorrechte (werden ggf. für die Installation von Docker/VS Code benötigt). +- Unter Windows: Eine funktionierende Winget-Installation wird empfohlen/benötigt für die automatische Installation [source: 166, 246]. WSL wird ggf. benötigt und aktiviert. +- Unter macOS: Homebrew wird empfohlen/benötigt (kann vom Tool installiert werden). +- Für das Bauen aus dem Quellcode: Eine aktuelle Go-Installation. -Download the appropriate binary for your operating system. +### Über Releases (Empfohlen) -### Option 2: Build from Source +Die einfachste Methode ist das Herunterladen einer vorkompilierten Version für Ihr Betriebssystem von der [**Releases-Seite**](https://codeberg.org/Pata1704/jws_gui/releases) . Laden Sie die passende Datei herunter, entpacken Sie sie ggf. und führen Sie die `jws` aus. -- Clone the repository: +### Aus dem Quellcode bauen -```bash -git clone https://github.com/yourusername/jws_gui.git -``` +1. Klonen Sie das Repository: + ```bash + git clone https://codeberg.org/Pata1704/jws_gui.git + cd jws_gui + ``` +2. Installieren Sie die von [Fyne](https://docs.fyne.io/started/) definierten Abhängigkeiten für ihr Betriebssytem +3. Bauen Sie die Anwendung: + ```bash + go build . + ``` + Dies erstellt die ausführbare Datei `jws` (oder `jws.exe` unter Windows) im aktuellen Verzeichnis. -Navigate to the project directory: +## Benutzung -```bash -cd jws_gui -``` +1. **Starten Sie die Anwendung** (`jws-Executable`). Ein Info-Fenster weist auf wichtige Punkte hin. +2. **Abhängigkeits-Check:** Die Anwendung prüft, ob Docker Desktop und Visual Studio Code installiert sind ("Dependency Screen"). + - Falls etwas fehlt, klicken Sie auf die entsprechenden Buttons, um die Installation anzustoßen. Folgen Sie den Anweisungen (ggf. sind Admin-Rechte nötig). Ein Fortschrittsbalken wird angezeigt. +3. **Template-Auswahl:** Sobald alle Abhängigkeiten erfüllt sind, gelangen Sie zum "Project Screen". Wählen Sie hier das gewünschte Projekt-Template aus (z.B. "JakartaEE Todo-App mit JSP"). +4. **Deployment:** Klicken Sie auf "Deploy". Wählen Sie im Dialog einen Zielordner auf Ihrem Rechner aus und bestätigen Sie. Die Template-Dateien werden dorthin kopiert. +5. **Öffnen in VS Code:** Die Anwendung öffnet das erstellte Projektverzeichnis automatisch in Visual Studio Code. +6. **In Container öffnen:** + - Stellen Sie sicher, dass Docker Desktop läuft. + - VS Code sollte eine Benachrichtigung anzeigen: "Folder contains a Dev Container configuration file. Reopen folder to develop in a container?" [source: 221]. Klicken Sie auf "**Reopen in Container**". + - (Falls die Benachrichtigung nicht erscheint: Klicken Sie auf das blaue Icon `><` unten links in der VS Code Statusleiste oder nutzen Sie die Befehlspalette (Ctrl+Shift+P) und suchen Sie nach "Dev Containers: Reopen in Container". +7. **Build & Run:** Docker/VS Code bauen nun das Image und starten die Container (dies kann beim ersten Mal etwas dauern). Sobald die Umgebung bereit ist, können Sie im integrierten Terminal von VS Code arbeiten, als wären Sie direkt im Container. + - **Beispiel (für JakartaEE JSP Template):** Führen Sie im VS Code Terminal aus: + ```bash + mvn clean package && sudo cp target/*.war /app/ + ``` + Dieser Befehl kompiliert das Projekt und kopiert die `.war`-Datei in das Deployment-Verzeichnis des laufenden OpenLiberty-Servers. +8. **Zugriff:** Nach kurzer Zeit ist die Beispielanwendung im Browser unter `http://localhost:9080/todo-app` (oder einem ähnlichen Port/Pfad je nach Template) erreichbar. -Install dependencies: +Sie haben nun eine funktionierende, containerisierte Entwicklungsumgebung, ohne sich manuell um Installationen oder Konfigurationen kümmern zu müssen! -The list of dependencies required for the development of Fyne Apps can be found at “https://docs.fyne.io/started/”. +## Enthaltene Projekt-Templates -```bash -go mod tidy -``` +Aktuell sind folgende Templates enthalten: -Build the application: +1. Jakarta EE mit Servlet/JSP +2. Jakarta EE mit JSF +3. Jakarta EE mit REST (JAX-RS) +4. Spring Boot mit REST -```bash -go build -``` +Alle Templates beinhalten eine PostgreSQL-Datenbankanbindung via Hibernate/JPA. -## Usage +## Funktionsweise (Dev Container) -Run the application: +Der Kern der Standardisierung basiert auf dem **Dev Container Standard**: -If you downloaded a pre-built binary: +1. Die `devcontainer.json`-Datei im Projektwurzelverzeichnis teilt VS Code mit, wie die Entwicklungsumgebung konfiguriert ist. +2. Sie verweist meist auf eine `docker-compose.yml`-Datei, die die notwendigen Dienste (Applikationscontainer, Datenbank etc.) definiert. +3. Die `Dockerfile(s)` definieren, wie die einzelnen Container-Images gebaut werden (Basis-Image, JDK, Tools, Abhängigkeiten). +4. Wenn Sie das Projekt in VS Code "im Container öffnen", startet VS Code die definierten Docker-Container und verbindet sich mit dem spezifizierten Entwicklungscontainer. +5. VS Code installiert automatisch die in der `devcontainer.json` festgelegten Extensions _innerhalb_ des Containers. +6. Sie arbeiten in VS Code (Terminal, Debugger, Code-Editor) nahtlos innerhalb dieser isolierten, vorkonfigurierten Umgebung. -```bash -./jakartaee-springboot-starter -``` +Dies stellt sicher, dass alle Nutzer exakt die gleiche Umgebung mit den richtigen Werkzeugversionen und Abhängigkeiten haben, unabhängig von ihrem lokalen System. -or by double-clicking the excutable. +## Bekannte Probleme / Limitationen -If you built from source: +- **SELinux (Fedora):** Unter Fedora mit aktiviertem SELinux kann es zu Problemen beim Mounten von Host-Verzeichnissen in Docker-Containern kommen. Ein Workaround ist `sudo setenforce 0` (nicht empfohlen), eine korrekte SELinux-Konfiguration für Docker ist komplexer. +- **Abhängigkeit von Paketmanagern:** Die automatische Installation hängt vom Funktionieren externer Tools wie Winget und Homebrew ab. Fehler in diesen Tools können die Installation behindern. +- **Manuelle Schritte:** Docker Desktop muss manuell gestartet werden, bevor "Reopen in Container" funktioniert +- **Installation Robustheit:** Obwohl auf mehreren Systemen getestet [source: 235], kann es auf spezifischen Konfigurationen zu Problemen kommen +- **Evaluation:** Bisher hauptsächlich technisch und durch Experten-Feedback evaluiert. Eine breite Evaluation mit Studierenden (Usability, Zeitersparnis) steht noch aus -```bash -./jakartaee-springboot-starter -``` +## Zukünftige Arbeit / Ausblick -The application will launch a GUI window where you can: +- Verbesserung der Robustheit der Installationsprozesse +- UI-Verbesserungen und automatische Sprachanpassung +- Erweiterung um zusätzliche Templates (z.B. andere Java-Versionen, Microservices, spezifische Bibliotheken) +- Plugin-System für Lehrende zur einfachen Erstellung eigener Templates +- Unterstützung für Git-Repositories als Template-Quelle +- Einführung einer Wahl der IDE (IntelliJ IDEA, Eclipse, NeoVim, Zed, Fleet) +- Umfassende quantitative Evaluation -1. Check and install dependencies (Visual Studio Code and Docker). -2. Select a starter project from the available options. -3. Deploy the selected project and open it in Visual Studio Code. +## Beitragen -## Project Structure +Beiträge sind willkommen! -_TODO_ +## Lizenz -## Customization +Dieses Projekt ist lizenziert unter der MIT Lizenz -To add new starter projects: +## Danksagung -1. Create a new project template in the projects/ directory. -2. Add the project details to the projects.json file. - -## Contributing - -Contributions are welcome! Please feel free to submit a Pull Request. - -License -[Insert your chosen license here] - -## Acknowledgments - -- Fyne: https://fyne.io/ -- JakartaEE: https://jakarta.ee/ -- Spring Boot: https://spring.io/projects/spring-boot +- Danke an meinem Dozenten im Modul "Programmieren von Webanwendungen" für die Betreuung der ursprünglichen Hausarbeit. +- Danke an die Teilnehmer der Umfrage für ihr wertvolles Feedback. +- Inspiration durch die Konzepte von Docker, Dev Containers und die Arbeiten von Malan et al. und Valstar et al. . From ff0e2b9890eb5e846e55e3c87229b57aeee18749 Mon Sep 17 00:00:00 2001 From: Pata1704 Date: Sat, 29 Mar 2025 18:15:22 +0000 Subject: [PATCH 18/38] Update Readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0652a92..8a063c6 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ Das Tool wurde in **Go** mit dem **Fyne** GUI-Toolkit entwickelt, um native Ausf - Ein unterstütztes Betriebssystem: Windows 10/11, macOS, gängige Linux-Distributionen (getestet unter Mint, Ubuntu, Fedora). - Administratorrechte (werden ggf. für die Installation von Docker/VS Code benötigt). -- Unter Windows: Eine funktionierende Winget-Installation wird empfohlen/benötigt für die automatische Installation [source: 166, 246]. WSL wird ggf. benötigt und aktiviert. +- Unter Windows: Eine funktionierende Winget-Installation wird empfohlen/benötigt für die automatische Installation. WSL wird ggf. benötigt und aktiviert. - Unter macOS: Homebrew wird empfohlen/benötigt (kann vom Tool installiert werden). - Für das Bauen aus dem Quellcode: Eine aktuelle Go-Installation. From 42cfaed2f90e85f958c6813d63834540512cc35b Mon Sep 17 00:00:00 2001 From: Pata1704 Date: Sat, 29 Mar 2025 18:18:28 +0000 Subject: [PATCH 19/38] Update Readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8a063c6..b2646a9 100644 --- a/README.md +++ b/README.md @@ -24,11 +24,11 @@ ## Motivation / Problemstellung -Die Einrichtung adäquater Entwicklungsumgebungen stellt besonders in der Lehre eine signifikante Hürde dar. Studierende nutzen oft heterogene Systeme (Betriebssysteme, installierte Software, Konfigurationen) [source: 9], was häufig zu Kompatibilitätsproblemen, zeitaufwendiger Fehlersuche und dem bekannten „Works on my machine“-Problem führt. Dies verursacht Frustration, erhöht den Betreuungsaufwand und lenkt vom eigentlichen Lerninhalt ab. Besonders bei komplexen Technologie-Stacks, wie sie in der Webentwicklung mit Java (z.B. Jakarta EE, Spring Boot, Datenbanken) üblich sind, ist die manuelle Konfiguration fehleranfällig. +Die Einrichtung adäquater Entwicklungsumgebungen stellt besonders in der Lehre eine signifikante Hürde dar. Studierende nutzen oft heterogene Systeme (Betriebssysteme, installierte Software, Konfigurationen), was häufig zu Kompatibilitätsproblemen, zeitaufwendiger Fehlersuche und dem bekannten „Works on my machine“-Problem führt. Dies verursacht Frustration, erhöht den Betreuungsaufwand und lenkt vom eigentlichen Lerninhalt ab. Besonders bei komplexen Technologie-Stacks, wie sie in der Webentwicklung mit Java (z.B. Jakarta EE, Spring Boot, Datenbanken) üblich sind, ist die manuelle Konfiguration fehleranfällig. ## Lösungsansatz -Dieses Projekt bietet eine plattformübergreifende Desktop-Anwendung (`jws-Executable`), die den Prozess der Bereitstellung standardisierter Entwicklungsumgebungen für universitäre Java-Webprojekte radikal vereinfacht. Unter Nutzung von **Docker** für die Containerisierung und dem **Dev Container Standard** ermöglicht das Tool Studierenden, mit wenigen Klicks eine vorkonfigurierte, lauffähige und konsistente Umgebung für spezifische Projektvorlagen zu initialisieren. +Dieses Projekt bietet eine plattformübergreifende Desktop-Anwendung (`jws`), die den Prozess der Bereitstellung standardisierter Entwicklungsumgebungen für universitäre Java-Webprojekte radikal vereinfacht. Unter Nutzung von **Docker** für die Containerisierung und dem **Dev Container Standard** ermöglicht das Tool Studierenden, mit wenigen Klicks eine vorkonfigurierte, lauffähige und konsistente Umgebung für spezifische Projektvorlagen zu initialisieren. Das Tool wurde in **Go** mit dem **Fyne** GUI-Toolkit entwickelt, um native Ausführbarkeit unter Windows, macOS und Linux zu gewährleisten @@ -97,7 +97,7 @@ Die einfachste Methode ist das Herunterladen einer vorkompilierten Version für ## Benutzung -1. **Starten Sie die Anwendung** (`jws-Executable`). Ein Info-Fenster weist auf wichtige Punkte hin. +1. **Starten Sie die Anwendung** (`jws`). Ein Info-Fenster weist auf wichtige Punkte hin. 2. **Abhängigkeits-Check:** Die Anwendung prüft, ob Docker Desktop und Visual Studio Code installiert sind ("Dependency Screen"). - Falls etwas fehlt, klicken Sie auf die entsprechenden Buttons, um die Installation anzustoßen. Folgen Sie den Anweisungen (ggf. sind Admin-Rechte nötig). Ein Fortschrittsbalken wird angezeigt. 3. **Template-Auswahl:** Sobald alle Abhängigkeiten erfüllt sind, gelangen Sie zum "Project Screen". Wählen Sie hier das gewünschte Projekt-Template aus (z.B. "JakartaEE Todo-App mit JSP"). @@ -105,7 +105,7 @@ Die einfachste Methode ist das Herunterladen einer vorkompilierten Version für 5. **Öffnen in VS Code:** Die Anwendung öffnet das erstellte Projektverzeichnis automatisch in Visual Studio Code. 6. **In Container öffnen:** - Stellen Sie sicher, dass Docker Desktop läuft. - - VS Code sollte eine Benachrichtigung anzeigen: "Folder contains a Dev Container configuration file. Reopen folder to develop in a container?" [source: 221]. Klicken Sie auf "**Reopen in Container**". + - VS Code sollte eine Benachrichtigung anzeigen: "Folder contains a Dev Container configuration file. Reopen folder to develop in a container?". Klicken Sie auf "**Reopen in Container**". - (Falls die Benachrichtigung nicht erscheint: Klicken Sie auf das blaue Icon `><` unten links in der VS Code Statusleiste oder nutzen Sie die Befehlspalette (Ctrl+Shift+P) und suchen Sie nach "Dev Containers: Reopen in Container". 7. **Build & Run:** Docker/VS Code bauen nun das Image und starten die Container (dies kann beim ersten Mal etwas dauern). Sobald die Umgebung bereit ist, können Sie im integrierten Terminal von VS Code arbeiten, als wären Sie direkt im Container. - **Beispiel (für JakartaEE JSP Template):** Führen Sie im VS Code Terminal aus: @@ -146,7 +146,7 @@ Dies stellt sicher, dass alle Nutzer exakt die gleiche Umgebung mit den richtige - **SELinux (Fedora):** Unter Fedora mit aktiviertem SELinux kann es zu Problemen beim Mounten von Host-Verzeichnissen in Docker-Containern kommen. Ein Workaround ist `sudo setenforce 0` (nicht empfohlen), eine korrekte SELinux-Konfiguration für Docker ist komplexer. - **Abhängigkeit von Paketmanagern:** Die automatische Installation hängt vom Funktionieren externer Tools wie Winget und Homebrew ab. Fehler in diesen Tools können die Installation behindern. - **Manuelle Schritte:** Docker Desktop muss manuell gestartet werden, bevor "Reopen in Container" funktioniert -- **Installation Robustheit:** Obwohl auf mehreren Systemen getestet [source: 235], kann es auf spezifischen Konfigurationen zu Problemen kommen +- **Installation Robustheit:** Obwohl auf mehreren Systemen getestet, kann es auf spezifischen Konfigurationen zu Problemen kommen - **Evaluation:** Bisher hauptsächlich technisch und durch Experten-Feedback evaluiert. Eine breite Evaluation mit Studierenden (Usability, Zeitersparnis) steht noch aus ## Zukünftige Arbeit / Ausblick From a41a262640da1cbc30be14a63aadb2f8617f4064 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Sun, 30 Mar 2025 12:20:05 +0200 Subject: [PATCH 20/38] docs: update changelog --- changelog.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/changelog.md b/changelog.md index 3040fda..34fd84f 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,12 @@ All notable changes to this project will be documented in this file. +## [0.6.0] - 2025-03-30 + +### 📚 Documentation + +- Update README + ## [0.5.0] - 2025-03-23 ### 🚀 Features @@ -9,6 +15,10 @@ All notable changes to this project will be documented in this file. - Add jakarta rest todo implementation with devcontainer setup - Added complete example for spring boot rest service with devcontainer +### 📚 Documentation + +- Update changelog.md + ## [0.4.0] - 2025-03-21 ### 🚀 Features From 75b0e7912ac90a67e295a70f138ddb15d06935dc Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Sun, 30 Mar 2025 12:27:29 +0200 Subject: [PATCH 21/38] docs: update README --- README.md | 3 + sbom.json | 1519 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1522 insertions(+) create mode 100644 sbom.json diff --git a/README.md b/README.md index b2646a9..7a9f5bd 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,9 @@ Dies stellt sicher, dass alle Nutzer exakt die gleiche Umgebung mit den richtige Beiträge sind willkommen! +## Software Bill of Materials (SBOM) +Das SBOM dieses Projekts finden Sie unter [sbom.json](sbom.json). + ## Lizenz Dieses Projekt ist lizenziert unter der MIT Lizenz diff --git a/sbom.json b/sbom.json new file mode 100644 index 0000000..e4484a6 --- /dev/null +++ b/sbom.json @@ -0,0 +1,1519 @@ +{ + "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json", + "bomFormat": "CycloneDX", + "specVersion": "1.6", + "serialNumber": "urn:uuid:4e0489d5-5636-4ff3-b80e-bcfff9da7d7f", + "version": 1, + "metadata": { + "timestamp": "2025-03-30T12:25:46+02:00", + "tools": [ + { + "vendor": "CycloneDX", + "name": "cyclonedx-gomod", + "version": "v1.9.0", + "hashes": [ + { + "alg": "MD5", + "content": "4946e448140ba8faeddacbe7a71f1522" + }, + { + "alg": "SHA-1", + "content": "db558a917ec8e829a2c08c113f21e3e6b3343c18" + }, + { + "alg": "SHA-256", + "content": "2cc216751b462902f566eb1339711ad0c0fc13052ee441bcf3e71163b128df78" + }, + { + "alg": "SHA-384", + "content": "afc86c8723f445aeadc2ed86ec7eb9f98e124455f62952d8bb1ba76b05322c665448d5165f08197d9dfd267ba854c72d" + }, + { + "alg": "SHA-512", + "content": "d442b5669e0663ffdea6cb3ff127c5fc2d67bcdf24c87d199947b3972dcdcfbf6e2ebbba9383b8488f0847e2d14d7357edad39c357a32e86778b03c9b31cf8b5" + } + ], + "externalReferences": [ + { + "url": "https://github.com/CycloneDX/cyclonedx-gomod", + "type": "vcs" + }, + { + "url": "https://cyclonedx.org", + "type": "website" + } + ] + } + ], + "component": { + "bom-ref": "pkg:golang/jws@v0.6.0?type=module", + "type": "application", + "name": "jws", + "version": "v0.6.0", + "purl": "pkg:golang/jws@v0.6.0?type=module\u0026goos=linux\u0026goarch=amd64", + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + } + }, + "components": [ + { + "bom-ref": "pkg:golang/fyne.io/fyne/v2@v2.6.0-alpha1?type=module", + "type": "library", + "name": "fyne.io/fyne/v2", + "version": "v2.6.0-alpha1", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "00bc752490dd0984299b9452ec220af5b6a6f47ee175d483b91cbf7f28fda5bf" + } + ], + "purl": "pkg:golang/fyne.io/fyne/v2@v2.6.0-alpha1?type=module\u0026goos=linux\u0026goarch=amd64", + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/fyne.io/systray@v1.11.0?type=module", + "type": "library", + "name": "fyne.io/systray", + "version": "v1.11.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "0fd1c84a5c52931fa31d29e230147a7c214e523935c7f38e3892daf6525800a8" + } + ], + "purl": "pkg:golang/fyne.io/systray@v1.11.0?type=module\u0026goos=linux\u0026goarch=amd64", + "evidence": { + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/fyne.io/tools@v1.0.0-alpha1?type=module", + "type": "library", + "name": "fyne.io/tools", + "version": "v1.0.0-alpha1", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "df9d1e17e2d53db20736060f0a83f4e320ac412150ddaba9013c77dc29598d99" + } + ], + "purl": "pkg:golang/fyne.io/tools@v1.0.0-alpha1?type=module\u0026goos=linux\u0026goarch=amd64", + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/BurntSushi/toml@v1.4.0?type=module", + "type": "library", + "name": "github.com/BurntSushi/toml", + "version": "v1.4.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "92ea08c59432d96451935a6db60f5ab1ff9656fead590b8135598af3e9ea3ebd" + } + ], + "purl": "pkg:golang/github.com/BurntSushi/toml@v1.4.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/BurntSushi/toml", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "type": "library", + "name": "github.com/davecgh/go-spew", + "version": "v1.1.1", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "be3f63feed5baa7bc211f24ec1486d94e011aacdfeae41d8635de36164d4f7b7" + } + ], + "purl": "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/davecgh/go-spew", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "0BSD" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/fredbi/uri@v1.1.0?type=module", + "type": "library", + "name": "github.com/fredbi/uri", + "version": "v1.1.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "3aa2e94d7b72460f400517aabc319d24fa99531b3c73204338c5c16ec902681f" + } + ], + "purl": "pkg:golang/github.com/fredbi/uri@v1.1.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/fredbi/uri", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/fsnotify/fsnotify@v1.8.0?type=module", + "type": "library", + "name": "github.com/fsnotify/fsnotify", + "version": "v1.8.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "740c2be900530592241bcae841a2631a87f4a69d04785fad355ed804fdc5ffc3" + } + ], + "purl": "pkg:golang/github.com/fsnotify/fsnotify@v1.8.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/fsnotify/fsnotify", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/fyne-io/gl-js@v0.1.0?type=module", + "type": "library", + "name": "github.com/fyne-io/gl-js", + "version": "v0.1.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "f25b89ccdb349ed100268fbcc7c91f50e5ee8d494ff2007740c3b13b69947693" + } + ], + "purl": "pkg:golang/github.com/fyne-io/gl-js@v0.1.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/fyne-io/gl-js", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/fyne-io/glfw-js@v0.1.0?type=module", + "type": "library", + "name": "github.com/fyne-io/glfw-js", + "version": "v0.1.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "44618c9958dcb06d7b3a27e5dd7d94279bc7dcf812e01d5463701278de415db2" + } + ], + "purl": "pkg:golang/github.com/fyne-io/glfw-js@v0.1.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/fyne-io/glfw-js", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/fyne-io/image@v0.1.0?type=module", + "type": "library", + "name": "github.com/fyne-io/image", + "version": "v0.1.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "566d93409d8f5861c27f78d88b5fd7ae868d34cbbe19f23f3b642949b65de174" + } + ], + "purl": "pkg:golang/github.com/fyne-io/image@v0.1.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/fyne-io/image", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/go-gl/gl@v0.0.0-20231021071112-07e5d0ea2e71?type=module", + "type": "library", + "name": "github.com/go-gl/gl", + "version": "v0.0.0-20231021071112-07e5d0ea2e71", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "e4157039a512053955668c063ba5591b0d87ff397d9eb77778265f615f8d7d00" + } + ], + "purl": "pkg:golang/github.com/go-gl/gl@v0.0.0-20231021071112-07e5d0ea2e71?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/go-gl/gl", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/go-gl/glfw/v3.3/glfw@v0.0.0-20240506104042-037f3cc74f2a?type=module", + "type": "library", + "name": "github.com/go-gl/glfw/v3.3/glfw", + "version": "v0.0.0-20240506104042-037f3cc74f2a", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "bf19c18450c34fec73c5fd634c928c299c371f4b307d693d46959b05b0cae7ed" + } + ], + "purl": "pkg:golang/github.com/go-gl/glfw/v3.3/glfw@v0.0.0-20240506104042-037f3cc74f2a?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/go-gl/glfw/v3.3/glfw", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/go-text/render@v0.2.0?type=module", + "type": "library", + "name": "github.com/go-text/render", + "version": "v0.2.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "2c16284e6a798d8889e0d3ea0dcda9cf5ecc2e6037c07c3575949519c39d7807" + } + ], + "purl": "pkg:golang/github.com/go-text/render@v0.2.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/go-text/render", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "Unlicense" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/go-text/typesetting@v0.2.1?type=module", + "type": "library", + "name": "github.com/go-text/typesetting", + "version": "v0.2.1", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "c748cc386c8edddd6a1403c8d23e064ac87b3344376298f3af8f8211583cd95f" + } + ], + "purl": "pkg:golang/github.com/go-text/typesetting@v0.2.1?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/go-text/typesetting", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "Unlicense" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/go-viper/mapstructure/v2@v2.2.1?type=module", + "type": "library", + "name": "github.com/go-viper/mapstructure/v2", + "version": "v2.2.1", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "64068e0b100d32e671e5109e834981744664ec365ab2fbd9231b47ab1f1a1acb" + } + ], + "purl": "pkg:golang/github.com/go-viper/mapstructure/v2@v2.2.1?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/go-viper/mapstructure", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/godbus/dbus/v5@v5.1.0?type=module", + "type": "library", + "name": "github.com/godbus/dbus/v5", + "version": "v5.1.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "e0a2e40314f768e63c2e2e054497bf2af868345171a349ba7cdb8550ef102549" + } + ], + "purl": "pkg:golang/github.com/godbus/dbus/v5@v5.1.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/godbus/dbus", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-2-Clause" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/jeandeaual/go-locale@v0.0.0-20241217141322-fcc2cadd6f08?type=module", + "type": "library", + "name": "github.com/jeandeaual/go-locale", + "version": "v0.0.0-20241217141322-fcc2cadd6f08", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "c0c795ceb3cede67c72162d9b4371268601ed88e0f5bd07f3f99cc9114b00807" + } + ], + "purl": "pkg:golang/github.com/jeandeaual/go-locale@v0.0.0-20241217141322-fcc2cadd6f08?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/jeandeaual/go-locale", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/jsummers/gobmp@v0.0.0-20230614200233-a9de23ed2e25?type=module", + "type": "library", + "name": "github.com/jsummers/gobmp", + "version": "v0.0.0-20230614200233-a9de23ed2e25", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "60bbebd5e13a71d0aa8ce7bdef6c3f71817e1635b7e2fdbbfbd568e75d3a0783" + } + ], + "purl": "pkg:golang/github.com/jsummers/gobmp@v0.0.0-20230614200233-a9de23ed2e25?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/jsummers/gobmp", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/nfnt/resize@v0.0.0-20180221191011-83c6a9932646?type=module", + "type": "library", + "name": "github.com/nfnt/resize", + "version": "v0.0.0-20180221191011-83c6a9932646", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "cd8c81903fe4f6c783d80edfb22e8ea362df15901e8638d0304440bd92c40e74" + } + ], + "purl": "pkg:golang/github.com/nfnt/resize@v0.0.0-20180221191011-83c6a9932646?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/nfnt/resize", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "0BSD" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/nicksnyder/go-i18n/v2@v2.5.1?type=module", + "type": "library", + "name": "github.com/nicksnyder/go-i18n/v2", + "version": "v2.5.1", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "231b4fc58b11f46a7ad1c1978dfb91fe5953a95f1a60cb02e3bdb30f40f5bc79" + } + ], + "purl": "pkg:golang/github.com/nicksnyder/go-i18n/v2@v2.5.1?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/nicksnyder/go-i18n", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/pelletier/go-toml/v2@v2.2.3?type=module", + "type": "library", + "name": "github.com/pelletier/go-toml/v2", + "version": "v2.2.3", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "626787c8b63c98559b764356c29afea882f66c4a93d28f79592764347bcbd763" + } + ], + "purl": "pkg:golang/github.com/pelletier/go-toml/v2@v2.2.3?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/pelletier/go-toml", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "type": "library", + "name": "github.com/pmezard/go-difflib", + "version": "v1.0.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "e030700c4d0d1b24280476cb4183f04943e808c591e41133224fdfd6565b0103" + } + ], + "purl": "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/pmezard/go-difflib", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/rymdport/portal@v0.3.0?type=module", + "type": "library", + "name": "github.com/rymdport/portal", + "version": "v0.3.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "4111dcc0ac31de463925341cb15866842dd31aa1906fd2c582154d532f00741f" + } + ], + "purl": "pkg:golang/github.com/rymdport/portal@v0.3.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/rymdport/portal", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/sagikazarmark/locafero@v0.7.0?type=module", + "type": "library", + "name": "github.com/sagikazarmark/locafero", + "version": "v0.7.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "e4caa90ec4c6343858f2c1a9d00a30c9fd2a2ac3eb85ec1a2d2b056a874f732a" + } + ], + "purl": "pkg:golang/github.com/sagikazarmark/locafero@v0.7.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/sagikazarmark/locafero", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/sourcegraph/conc@v0.3.0?type=module", + "type": "library", + "name": "github.com/sourcegraph/conc", + "version": "v0.3.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "3904db6ede8fef62f6d14a809175ee2ce8fbf4b7c46a743e61014da4b03dc92a" + } + ], + "purl": "pkg:golang/github.com/sourcegraph/conc@v0.3.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/sourcegraph/conc", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/spf13/afero@v1.12.0?type=module", + "type": "library", + "name": "github.com/spf13/afero", + "version": "v1.12.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "51c38fc910587339859facafa61c649fd644398eb9729c0629be662f7ea6aeab" + } + ], + "purl": "pkg:golang/github.com/spf13/afero@v1.12.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/spf13/afero", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/spf13/cast@v1.7.1?type=module", + "type": "library", + "name": "github.com/spf13/cast", + "version": "v1.7.1", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "72e3446a005010758dd459db1848c25cbdaccd8117a9f24f6cfd8735469c6bd6" + } + ], + "purl": "pkg:golang/github.com/spf13/cast@v1.7.1?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/spf13/cast", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/spf13/pflag@v1.0.6?type=module", + "type": "library", + "name": "github.com/spf13/pflag", + "version": "v1.0.6", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8c5cc718b18095bdebbb12c1f0c85b23a03cf80417ff6796e2a7b23595cda76a" + } + ], + "purl": "pkg:golang/github.com/spf13/pflag@v1.0.6?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/spf13/pflag", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/spf13/viper@v1.20.0?type=module", + "type": "library", + "name": "github.com/spf13/viper", + "version": "v1.20.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "cebc48c91dd14083ac6ab22b80bf3eb00bc02d7ba5f637843dad3a6343e1eaf6" + } + ], + "purl": "pkg:golang/github.com/spf13/viper@v1.20.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/spf13/viper", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/srwiley/oksvg@v0.0.0-20221011165216-be6e8873101c?type=module", + "type": "library", + "name": "github.com/srwiley/oksvg", + "version": "v0.0.0-20221011165216-be6e8873101c", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "926f06a6842eb74e5e6371a261611e75b4d3d2a9d2c6b0a3b156dbef2298d4a1" + } + ], + "purl": "pkg:golang/github.com/srwiley/oksvg@v0.0.0-20221011165216-be6e8873101c?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/srwiley/oksvg", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/srwiley/rasterx@v0.0.0-20220730225603-2ab79fcdd4ef?type=module", + "type": "library", + "name": "github.com/srwiley/rasterx", + "version": "v0.0.0-20220730225603-2ab79fcdd4ef", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "0a1e90f80654c4304256a76423c152a45c990ed09505cd9599e8dd36b9b9ad14" + } + ], + "purl": "pkg:golang/github.com/srwiley/rasterx@v0.0.0-20220730225603-2ab79fcdd4ef?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/srwiley/rasterx", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-3-Clause" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "type": "library", + "name": "github.com/stretchr/testify", + "version": "v1.10.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "5efe5eac18d3c1eff9231a94413757bf9920988bdb1e8dd0432470849b0e7c90" + } + ], + "purl": "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/stretchr/testify", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/subosito/gotenv@v1.6.0?type=module", + "type": "library", + "name": "github.com/subosito/gotenv", + "version": "v1.6.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "f4d9530dcd454ece2abb40c3abb004b533cdc3a4959bbb8132c50252300121ff" + } + ], + "purl": "pkg:golang/github.com/subosito/gotenv@v1.6.0?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/subosito/gotenv", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/github.com/yuin/goldmark@v1.7.8?type=module", + "type": "library", + "name": "github.com/yuin/goldmark", + "version": "v1.7.8", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "88444c2e7d3f409787161c52b77a7a3de37d9869ef20a4a91bd618a2b0cc9e27" + } + ], + "purl": "pkg:golang/github.com/yuin/goldmark@v1.7.8?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/yuin/goldmark", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/go.uber.org/atomic@v1.9.0?type=module", + "type": "library", + "name": "go.uber.org/atomic", + "version": "v1.9.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "102984f019ff5854d8c045bf6e9283dccf15b51ff34156dabc0a1a942d4f6321" + } + ], + "purl": "pkg:golang/go.uber.org/atomic@v1.9.0?type=module\u0026goos=linux\u0026goarch=amd64", + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/go.uber.org/multierr@v1.9.0?type=module", + "type": "library", + "name": "go.uber.org/multierr", + "version": "v1.9.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "edf23073f66d4b4abef9581c7ea143c5205956ffd7a38f7f4989c316ea54c252" + } + ], + "purl": "pkg:golang/go.uber.org/multierr@v1.9.0?type=module\u0026goos=linux\u0026goarch=amd64", + "evidence": { + "licenses": [ + { + "license": { + "id": "MIT" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/golang.org/x/image@v0.24.0?type=module", + "type": "library", + "name": "golang.org/x/image", + "version": "v0.24.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "00def346056c6ef9937cdcaa21b6ceada60bf264b070a9dc123f287e383370c4" + } + ], + "purl": "pkg:golang/golang.org/x/image@v0.24.0?type=module\u0026goos=linux\u0026goarch=amd64", + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-Source-Code" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/golang.org/x/net@v0.33.0?type=module", + "type": "library", + "name": "golang.org/x/net", + "version": "v0.33.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "ef84981e557c0488072050bf2eb6243862302f5f5e4d85d0e7073a4c1b8edfa2" + } + ], + "purl": "pkg:golang/golang.org/x/net@v0.33.0?type=module\u0026goos=linux\u0026goarch=amd64", + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-Source-Code" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/golang.org/x/sys@v0.30.0?type=module", + "type": "library", + "name": "golang.org/x/sys", + "version": "v0.30.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "423912c0fff7e9adb48c5616912b9ed58c17ccb9ac57919fabb122cbbd82d6e7" + } + ], + "purl": "pkg:golang/golang.org/x/sys@v0.30.0?type=module\u0026goos=linux\u0026goarch=amd64", + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-Source-Code" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/golang.org/x/text@v0.22.0?type=module", + "type": "library", + "name": "golang.org/x/text", + "version": "v0.22.0", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "6e87eaee6dff1c016f6c5e758f3dd0f702e0de392f48fba266efe90f55f082d3" + } + ], + "purl": "pkg:golang/golang.org/x/text@v0.22.0?type=module\u0026goos=linux\u0026goarch=amd64", + "evidence": { + "licenses": [ + { + "license": { + "id": "BSD-Source-Code" + } + } + ] + } + }, + { + "bom-ref": "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", + "type": "library", + "name": "gopkg.in/yaml.v3", + "version": "v3.0.1", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "7f1566fc6cc0cc45aa2c7baf72d23dd4a4bd8613669963a85aed174d8252ec20" + } + ], + "purl": "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module\u0026goos=linux\u0026goarch=amd64", + "externalReferences": [ + { + "url": "https://github.com/go-yaml/yaml", + "type": "vcs" + } + ], + "evidence": { + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + } + ] + } + } + ], + "dependencies": [ + { + "ref": "pkg:golang/jws@v0.6.0?type=module", + "dependsOn": [ + "pkg:golang/fyne.io/fyne/v2@v2.6.0-alpha1?type=module", + "pkg:golang/fyne.io/tools@v1.0.0-alpha1?type=module", + "pkg:golang/github.com/spf13/viper@v1.20.0?type=module" + ] + }, + { + "ref": "pkg:golang/fyne.io/fyne/v2@v2.6.0-alpha1?type=module", + "dependsOn": [ + "pkg:golang/fyne.io/systray@v1.11.0?type=module", + "pkg:golang/github.com/BurntSushi/toml@v1.4.0?type=module", + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/fredbi/uri@v1.1.0?type=module", + "pkg:golang/github.com/fsnotify/fsnotify@v1.8.0?type=module", + "pkg:golang/github.com/fyne-io/gl-js@v0.1.0?type=module", + "pkg:golang/github.com/fyne-io/glfw-js@v0.1.0?type=module", + "pkg:golang/github.com/fyne-io/image@v0.1.0?type=module", + "pkg:golang/github.com/go-gl/gl@v0.0.0-20231021071112-07e5d0ea2e71?type=module", + "pkg:golang/github.com/go-gl/glfw/v3.3/glfw@v0.0.0-20240506104042-037f3cc74f2a?type=module", + "pkg:golang/github.com/go-text/render@v0.2.0?type=module", + "pkg:golang/github.com/go-text/typesetting@v0.2.1?type=module", + "pkg:golang/github.com/godbus/dbus/v5@v5.1.0?type=module", + "pkg:golang/github.com/jeandeaual/go-locale@v0.0.0-20241217141322-fcc2cadd6f08?type=module", + "pkg:golang/github.com/jsummers/gobmp@v0.0.0-20230614200233-a9de23ed2e25?type=module", + "pkg:golang/github.com/nfnt/resize@v0.0.0-20180221191011-83c6a9932646?type=module", + "pkg:golang/github.com/nicksnyder/go-i18n/v2@v2.5.1?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/github.com/rymdport/portal@v0.3.0?type=module", + "pkg:golang/github.com/srwiley/oksvg@v0.0.0-20221011165216-be6e8873101c?type=module", + "pkg:golang/github.com/srwiley/rasterx@v0.0.0-20220730225603-2ab79fcdd4ef?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "pkg:golang/github.com/yuin/goldmark@v1.7.8?type=module", + "pkg:golang/golang.org/x/image@v0.24.0?type=module", + "pkg:golang/golang.org/x/net@v0.33.0?type=module", + "pkg:golang/golang.org/x/sys@v0.30.0?type=module", + "pkg:golang/golang.org/x/text@v0.22.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/fyne.io/systray@v1.11.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/godbus/dbus/v5@v5.1.0?type=module", + "pkg:golang/golang.org/x/sys@v0.30.0?type=module" + ] + }, + { + "ref": "pkg:golang/fyne.io/tools@v1.0.0-alpha1?type=module", + "dependsOn": [ + "pkg:golang/fyne.io/fyne/v2@v2.6.0-alpha1?type=module", + "pkg:golang/github.com/BurntSushi/toml@v1.4.0?type=module", + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/fyne-io/image@v0.1.0?type=module", + "pkg:golang/github.com/jsummers/gobmp@v0.0.0-20230614200233-a9de23ed2e25?type=module", + "pkg:golang/github.com/nfnt/resize@v0.0.0-20180221191011-83c6a9932646?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "pkg:golang/golang.org/x/image@v0.24.0?type=module", + "pkg:golang/golang.org/x/sys@v0.30.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/BurntSushi/toml@v1.4.0?type=module" + }, + { + "ref": "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module" + }, + { + "ref": "pkg:golang/github.com/fredbi/uri@v1.1.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/fsnotify/fsnotify@v1.8.0?type=module", + "dependsOn": [ + "pkg:golang/golang.org/x/sys@v0.30.0?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/fyne-io/gl-js@v0.1.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/go-gl/gl@v0.0.0-20231021071112-07e5d0ea2e71?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/fyne-io/glfw-js@v0.1.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/go-gl/glfw/v3.3/glfw@v0.0.0-20240506104042-037f3cc74f2a?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/fyne-io/image@v0.1.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/jsummers/gobmp@v0.0.0-20230614200233-a9de23ed2e25?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/go-gl/gl@v0.0.0-20231021071112-07e5d0ea2e71?type=module" + }, + { + "ref": "pkg:golang/github.com/go-gl/glfw/v3.3/glfw@v0.0.0-20240506104042-037f3cc74f2a?type=module" + }, + { + "ref": "pkg:golang/github.com/go-text/render@v0.2.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/go-text/typesetting@v0.2.1?type=module", + "pkg:golang/github.com/srwiley/oksvg@v0.0.0-20221011165216-be6e8873101c?type=module", + "pkg:golang/github.com/srwiley/rasterx@v0.0.0-20220730225603-2ab79fcdd4ef?type=module", + "pkg:golang/golang.org/x/image@v0.24.0?type=module", + "pkg:golang/golang.org/x/net@v0.33.0?type=module", + "pkg:golang/golang.org/x/text@v0.22.0?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/go-text/typesetting@v0.2.1?type=module", + "dependsOn": [ + "pkg:golang/golang.org/x/image@v0.24.0?type=module", + "pkg:golang/golang.org/x/text@v0.22.0?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/go-viper/mapstructure/v2@v2.2.1?type=module" + }, + { + "ref": "pkg:golang/github.com/godbus/dbus/v5@v5.1.0?type=module" + }, + { + "ref": "pkg:golang/github.com/jeandeaual/go-locale@v0.0.0-20241217141322-fcc2cadd6f08?type=module", + "dependsOn": [ + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "pkg:golang/golang.org/x/sys@v0.30.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/jsummers/gobmp@v0.0.0-20230614200233-a9de23ed2e25?type=module" + }, + { + "ref": "pkg:golang/github.com/nfnt/resize@v0.0.0-20180221191011-83c6a9932646?type=module" + }, + { + "ref": "pkg:golang/github.com/nicksnyder/go-i18n/v2@v2.5.1?type=module", + "dependsOn": [ + "pkg:golang/github.com/BurntSushi/toml@v1.4.0?type=module", + "pkg:golang/golang.org/x/text@v0.22.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/pelletier/go-toml/v2@v2.2.3?type=module", + "dependsOn": [ + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module" + }, + { + "ref": "pkg:golang/github.com/rymdport/portal@v0.3.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/godbus/dbus/v5@v5.1.0?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/sagikazarmark/locafero@v0.7.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/github.com/sourcegraph/conc@v0.3.0?type=module", + "pkg:golang/github.com/spf13/afero@v1.12.0?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "pkg:golang/go.uber.org/atomic@v1.9.0?type=module", + "pkg:golang/go.uber.org/multierr@v1.9.0?type=module", + "pkg:golang/golang.org/x/text@v0.22.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/sourcegraph/conc@v0.3.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "pkg:golang/go.uber.org/atomic@v1.9.0?type=module", + "pkg:golang/go.uber.org/multierr@v1.9.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/spf13/afero@v1.12.0?type=module", + "dependsOn": [ + "pkg:golang/golang.org/x/net@v0.33.0?type=module", + "pkg:golang/golang.org/x/sys@v0.30.0?type=module", + "pkg:golang/golang.org/x/text@v0.22.0?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/spf13/cast@v1.7.1?type=module" + }, + { + "ref": "pkg:golang/github.com/spf13/pflag@v1.0.6?type=module" + }, + { + "ref": "pkg:golang/github.com/spf13/viper@v1.20.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/fsnotify/fsnotify@v1.8.0?type=module", + "pkg:golang/github.com/go-viper/mapstructure/v2@v2.2.1?type=module", + "pkg:golang/github.com/pelletier/go-toml/v2@v2.2.3?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/github.com/sagikazarmark/locafero@v0.7.0?type=module", + "pkg:golang/github.com/sourcegraph/conc@v0.3.0?type=module", + "pkg:golang/github.com/spf13/afero@v1.12.0?type=module", + "pkg:golang/github.com/spf13/cast@v1.7.1?type=module", + "pkg:golang/github.com/spf13/pflag@v1.0.6?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "pkg:golang/github.com/subosito/gotenv@v1.6.0?type=module", + "pkg:golang/go.uber.org/atomic@v1.9.0?type=module", + "pkg:golang/go.uber.org/multierr@v1.9.0?type=module", + "pkg:golang/golang.org/x/sys@v0.30.0?type=module", + "pkg:golang/golang.org/x/text@v0.22.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/srwiley/oksvg@v0.0.0-20221011165216-be6e8873101c?type=module", + "dependsOn": [ + "pkg:golang/github.com/srwiley/rasterx@v0.0.0-20220730225603-2ab79fcdd4ef?type=module", + "pkg:golang/golang.org/x/image@v0.24.0?type=module", + "pkg:golang/golang.org/x/net@v0.33.0?type=module", + "pkg:golang/golang.org/x/text@v0.22.0?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/srwiley/rasterx@v0.0.0-20220730225603-2ab79fcdd4ef?type=module", + "dependsOn": [ + "pkg:golang/golang.org/x/image@v0.24.0?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/subosito/gotenv@v1.6.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "pkg:golang/golang.org/x/text@v0.22.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/github.com/yuin/goldmark@v1.7.8?type=module" + }, + { + "ref": "pkg:golang/go.uber.org/atomic@v1.9.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module" + ] + }, + { + "ref": "pkg:golang/go.uber.org/multierr@v1.9.0?type=module", + "dependsOn": [ + "pkg:golang/github.com/davecgh/go-spew@v1.1.1?type=module", + "pkg:golang/github.com/pmezard/go-difflib@v1.0.0?type=module", + "pkg:golang/github.com/stretchr/testify@v1.10.0?type=module", + "pkg:golang/go.uber.org/atomic@v1.9.0?type=module", + "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + ] + }, + { + "ref": "pkg:golang/golang.org/x/image@v0.24.0?type=module", + "dependsOn": [ + "pkg:golang/golang.org/x/text@v0.22.0?type=module" + ] + }, + { + "ref": "pkg:golang/golang.org/x/net@v0.33.0?type=module", + "dependsOn": [ + "pkg:golang/golang.org/x/sys@v0.30.0?type=module", + "pkg:golang/golang.org/x/text@v0.22.0?type=module" + ] + }, + { + "ref": "pkg:golang/golang.org/x/sys@v0.30.0?type=module" + }, + { + "ref": "pkg:golang/golang.org/x/text@v0.22.0?type=module" + }, + { + "ref": "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" + } + ] +} From f445c7730118e367851c1bd97931c5e882a3ab5d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 4 Jun 2025 14:57:37 +0000 Subject: [PATCH 22/38] Add renovate.json --- renovate.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..7190a60 --- /dev/null +++ b/renovate.json @@ -0,0 +1,3 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json" +} From 01fdb7e1e3cdbd5cc29945a7d959bc393efe2102 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 4 Jun 2025 18:02:37 +0000 Subject: [PATCH 23/38] chore(deps): replace dependency org.hibernate:hibernate-core with org.hibernate.orm:hibernate-core --- cmd/jws/projects/jakarta-faces-todo/pom.xml | 4 ++-- cmd/jws/projects/jakarta-jsp-todo/pom.xml | 4 ++-- cmd/jws/projects/jakarta-rest-todo/pom.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/jws/projects/jakarta-faces-todo/pom.xml b/cmd/jws/projects/jakarta-faces-todo/pom.xml index f96bbf1..3c900a1 100644 --- a/cmd/jws/projects/jakarta-faces-todo/pom.xml +++ b/cmd/jws/projects/jakarta-faces-todo/pom.xml @@ -52,9 +52,9 @@ - org.hibernate + org.hibernate.orm hibernate-core - 6.3.1.Final + 7.0.0.Final diff --git a/cmd/jws/projects/jakarta-jsp-todo/pom.xml b/cmd/jws/projects/jakarta-jsp-todo/pom.xml index 3158166..a2162c8 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/pom.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/pom.xml @@ -54,9 +54,9 @@ - org.hibernate + org.hibernate.orm hibernate-core - 6.3.1.Final + 7.0.0.Final diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index e0eee0f..a1ecbf1 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -77,9 +77,9 @@ provided - org.hibernate + org.hibernate.orm hibernate-core - 6.3.1.Final + 7.0.0.Final From f37f01308ee6a11553f626cf27f2e59cb1a18f43 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 4 Jun 2025 18:02:40 +0000 Subject: [PATCH 24/38] chore(deps): update dependency jakarta.json:jakarta.json-api to v2.1.3 --- cmd/jws/projects/jakarta-rest-todo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index e0eee0f..a3f7c5e 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -73,7 +73,7 @@ jakarta.json jakarta.json-api - 2.1.0 + 2.1.3 provided From 6632fca48cc2eb202b2664f28995ee2891f3b092 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 4 Jun 2025 20:05:21 +0000 Subject: [PATCH 25/38] chore(deps): update dependency jakarta.json.bind:jakarta.json.bind-api to v3.0.1 --- cmd/jws/projects/jakarta-rest-todo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index e28cb25..2366bfa 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -65,7 +65,7 @@ jakarta.json.bind jakarta.json.bind-api - 3.0.0 + 3.0.1 provided From 7a45eb3c92310ce6330cde13a43ad98b87fa4fbd Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 4 Jun 2025 20:05:23 +0000 Subject: [PATCH 26/38] chore(deps): update dependency jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api to v3.0.2 --- cmd/jws/projects/jakarta-jsp-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-rest-todo/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/jws/projects/jakarta-jsp-todo/pom.xml b/cmd/jws/projects/jakarta-jsp-todo/pom.xml index a2162c8..933e78b 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/pom.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/pom.xml @@ -45,7 +45,7 @@ jakarta.servlet.jsp.jstl jakarta.servlet.jsp.jstl-api - 3.0.0 + 3.0.2 org.glassfish.web diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index e28cb25..9bcf6ac 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -45,7 +45,7 @@ jakarta.servlet.jsp.jstl jakarta.servlet.jsp.jstl-api - 3.0.0 + 3.0.2 org.glassfish.web From 23de1e244df07dbbaf74caecac9d2a00207c43a1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 4 Jun 2025 21:10:10 +0000 Subject: [PATCH 27/38] chore(deps): update module fyne.io/fyne/v2 to v2.6.1 --- go.mod | 13 ++++++++----- go.sum | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index d0b4ede..02a9a41 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module jws go 1.23.5 require ( - fyne.io/fyne/v2 v2.6.0-alpha1 + fyne.io/fyne/v2 v2.6.1 fyne.io/tools v1.0.0-alpha1 github.com/spf13/viper v1.20.0 ) @@ -15,21 +15,24 @@ require ( github.com/fredbi/uri v1.1.0 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fyne-io/gl-js v0.1.0 // indirect - github.com/fyne-io/glfw-js v0.1.0 // indirect - github.com/fyne-io/image v0.1.0 // indirect + github.com/fyne-io/glfw-js v0.2.0 // indirect + github.com/fyne-io/image v0.1.1 // indirect + github.com/fyne-io/oksvg v0.1.0 // indirect github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a // indirect github.com/go-text/render v0.2.0 // indirect github.com/go-text/typesetting v0.2.1 // indirect github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/hack-pad/go-indexeddb v0.3.2 // indirect + github.com/hack-pad/safejs v0.1.0 // indirect github.com/jeandeaual/go-locale v0.0.0-20241217141322-fcc2cadd6f08 // indirect github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect github.com/nicksnyder/go-i18n/v2 v2.5.1 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rymdport/portal v0.3.0 // indirect + github.com/rymdport/portal v0.4.1 // indirect github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.12.0 // indirect @@ -43,7 +46,7 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/image v0.24.0 // indirect - golang.org/x/net v0.33.0 // indirect + golang.org/x/net v0.35.0 // indirect golang.org/x/sys v0.30.0 // indirect golang.org/x/text v0.22.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 02e6c16..34429ee 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ fyne.io/fyne/v2 v2.6.0-alpha1 h1:ALx1JJDdCYQpm5RS7CIK9bam9H7hddSDuRy/fyj9pb8= fyne.io/fyne/v2 v2.6.0-alpha1/go.mod h1:Bzv2yK+ncZ8LJbHKjyJJpEAFlbs6oulHgKm04ObOqA8= +fyne.io/fyne/v2 v2.6.1 h1:kjPJD4/rBS9m2nHJp+npPSuaK79yj6ObMTuzR6VQ1Is= +fyne.io/fyne/v2 v2.6.1/go.mod h1:YZt7SksjvrSNJCwbWFV32WON3mE1Sr7L41D29qMZ/lU= fyne.io/systray v1.11.0 h1:D9HISlxSkx+jHSniMBR6fCFOUjk1x/OOOJLa9lJYAKg= fyne.io/systray v1.11.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= fyne.io/tools v1.0.0-alpha1 h1:350eF+LVPbIHNgYPCoP04yCsQSFQ3aupATx33ClZjZk= @@ -21,8 +23,14 @@ github.com/fyne-io/gl-js v0.1.0 h1:8luJzNs0ntEAJo+8x8kfUOXujUlP8gB3QMOxO2mUdpM= github.com/fyne-io/gl-js v0.1.0/go.mod h1:ZcepK8vmOYLu96JoxbCKJy2ybr+g1pTnaBDdl7c3ajI= github.com/fyne-io/glfw-js v0.1.0 h1:RGGMmVjcsG17Oifl3X2UJ5vH3PgS4B1UY3ASeN5BXbI= github.com/fyne-io/glfw-js v0.1.0/go.mod h1:Ri6te7rdZtBgBpxLW19uBpp3Dl6K9K/bRaYdJ22G8Jk= +github.com/fyne-io/glfw-js v0.2.0 h1:8GUZtN2aCoTPNqgRDxK5+kn9OURINhBEBc7M4O1KrmM= +github.com/fyne-io/glfw-js v0.2.0/go.mod h1:Ri6te7rdZtBgBpxLW19uBpp3Dl6K9K/bRaYdJ22G8Jk= github.com/fyne-io/image v0.1.0 h1:Vm2TQJ2PWGHCf3jYi1/XroaNNMu+GfI/O2QpSbZd4XQ= github.com/fyne-io/image v0.1.0/go.mod h1:xrfYBh6yspc+KjkgdZU/ifUC9sPA5Iv7WYUBzQKK7JM= +github.com/fyne-io/image v0.1.1 h1:WH0z4H7qfvNUw5l4p3bC1q70sa5+YWVt6HCj7y4VNyA= +github.com/fyne-io/image v0.1.1/go.mod h1:xrfYBh6yspc+KjkgdZU/ifUC9sPA5Iv7WYUBzQKK7JM= +github.com/fyne-io/oksvg v0.1.0 h1:7EUKk3HV3Y2E+qypp3nWqMXD7mum0hCw2KEGhI1fnBw= +github.com/fyne-io/oksvg v0.1.0/go.mod h1:dJ9oEkPiWhnTFNCmRgEze+YNprJF7YRbpjgpWS4kzoI= github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA= github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a h1:vxnBhFDDT+xzxf1jTJKMKZw3H0swfWk9RpWbBbDK5+0= @@ -41,6 +49,10 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/hack-pad/go-indexeddb v0.3.2 h1:DTqeJJYc1usa45Q5r52t01KhvlSN02+Oq+tQbSBI91A= +github.com/hack-pad/go-indexeddb v0.3.2/go.mod h1:QvfTevpDVlkfomY498LhstjwbPW6QC4VC/lxYb0Kom0= +github.com/hack-pad/safejs v0.1.0 h1:qPS6vjreAqh2amUqj4WNG1zIw7qlRQJ9K10eDKMCnE8= +github.com/hack-pad/safejs v0.1.0/go.mod h1:HdS+bKF1NrE72VoXZeWzxFOVQVUSqZJAG0xNCnb+Tio= github.com/jeandeaual/go-locale v0.0.0-20241217141322-fcc2cadd6f08 h1:wMeVzrPO3mfHIWLZtDcSaGAe2I4PW9B/P5nMkRSwCAc= github.com/jeandeaual/go-locale v0.0.0-20241217141322-fcc2cadd6f08/go.mod h1:ZDXo8KHryOWSIqnsb/CiDq7hQUYryCgdVnxbj8tDG7o= github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M= @@ -65,6 +77,8 @@ github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZV github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rymdport/portal v0.3.0 h1:QRHcwKwx3kY5JTQcsVhmhC3TGqGQb9LFghVNUy8AdB8= github.com/rymdport/portal v0.3.0/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4= +github.com/rymdport/portal v0.4.1 h1:2dnZhjf5uEaeDjeF/yBIeeRo6pNI2QAKm7kq1w/kbnA= +github.com/rymdport/portal v0.4.1/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4= github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= @@ -97,6 +111,8 @@ golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ= golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= From 100e2b28de93f16be2b77e8256cbf8f1e0771b7c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 4 Jun 2025 22:13:14 +0000 Subject: [PATCH 28/38] chore(deps): update module github.com/spf13/viper to v1.20.1 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index d0b4ede..1dc2d40 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.5 require ( fyne.io/fyne/v2 v2.6.0-alpha1 fyne.io/tools v1.0.0-alpha1 - github.com/spf13/viper v1.20.0 + github.com/spf13/viper v1.20.1 ) require ( diff --git a/go.sum b/go.sum index 02e6c16..12923f6 100644 --- a/go.sum +++ b/go.sum @@ -77,6 +77,8 @@ github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.20.0 h1:zrxIyR3RQIOsarIrgL8+sAvALXul9jeEPa06Y0Ph6vY= github.com/spf13/viper v1.20.0/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= +github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= From dad67158a633457fdffc9cf041f84402bfa1a6eb Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 4 Jun 2025 22:13:17 +0000 Subject: [PATCH 29/38] chore(deps): update dependency io.openliberty.tools:liberty-maven-plugin to v3.11.3 --- cmd/jws/projects/jakarta-faces-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-jsp-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-rest-todo/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/jws/projects/jakarta-faces-todo/pom.xml b/cmd/jws/projects/jakarta-faces-todo/pom.xml index 3c900a1..05e59fb 100644 --- a/cmd/jws/projects/jakarta-faces-todo/pom.xml +++ b/cmd/jws/projects/jakarta-faces-todo/pom.xml @@ -80,7 +80,7 @@ io.openliberty.tools liberty-maven-plugin - 3.7.1 + 3.11.3 diff --git a/cmd/jws/projects/jakarta-jsp-todo/pom.xml b/cmd/jws/projects/jakarta-jsp-todo/pom.xml index a2162c8..d28aea7 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/pom.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/pom.xml @@ -82,7 +82,7 @@ io.openliberty.tools liberty-maven-plugin - 3.7.1 + 3.11.3 diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index e28cb25..9ff09a1 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -105,7 +105,7 @@ io.openliberty.tools liberty-maven-plugin - 3.7.1 + 3.11.3 From 0ab7c7aa3f9c7522f91372211847f768f84b9aef Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 5 Jun 2025 01:31:58 +0000 Subject: [PATCH 30/38] chore(deps): update dependency jakarta.websocket:jakarta.websocket-api to v2.2.0 --- cmd/jws/projects/jakarta-faces-todo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/jws/projects/jakarta-faces-todo/pom.xml b/cmd/jws/projects/jakarta-faces-todo/pom.xml index 3c900a1..08bac2c 100644 --- a/cmd/jws/projects/jakarta-faces-todo/pom.xml +++ b/cmd/jws/projects/jakarta-faces-todo/pom.xml @@ -46,7 +46,7 @@ jakarta.websocket jakarta.websocket-api - 2.1.0 + 2.2.0 provided From 6415097740a3c314e7a0f8ba87459f5682eca27e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 5 Jun 2025 01:32:01 +0000 Subject: [PATCH 31/38] chore(deps): update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.14.0 --- cmd/jws/projects/jakarta-faces-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-jsp-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-rest-todo/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/jws/projects/jakarta-faces-todo/pom.xml b/cmd/jws/projects/jakarta-faces-todo/pom.xml index 3c900a1..51da42c 100644 --- a/cmd/jws/projects/jakarta-faces-todo/pom.xml +++ b/cmd/jws/projects/jakarta-faces-todo/pom.xml @@ -70,7 +70,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.10.1 + 3.14.0 org.apache.maven.plugins diff --git a/cmd/jws/projects/jakarta-jsp-todo/pom.xml b/cmd/jws/projects/jakarta-jsp-todo/pom.xml index a2162c8..bdfd354 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/pom.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/pom.xml @@ -72,7 +72,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.10.1 + 3.14.0 org.apache.maven.plugins diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index e28cb25..b7cda5d 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -95,7 +95,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.10.1 + 3.14.0 org.apache.maven.plugins From bd2abab88e54665e5e05f6a23aff0ba632c65ffb Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 5 Jun 2025 03:55:23 +0000 Subject: [PATCH 32/38] chore(deps): update dependency org.apache.maven.plugins:maven-war-plugin to v3.4.0 --- cmd/jws/projects/jakarta-faces-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-jsp-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-rest-todo/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/jws/projects/jakarta-faces-todo/pom.xml b/cmd/jws/projects/jakarta-faces-todo/pom.xml index 3c900a1..49613be 100644 --- a/cmd/jws/projects/jakarta-faces-todo/pom.xml +++ b/cmd/jws/projects/jakarta-faces-todo/pom.xml @@ -75,7 +75,7 @@ org.apache.maven.plugins maven-war-plugin - 3.3.2 + 3.4.0 io.openliberty.tools diff --git a/cmd/jws/projects/jakarta-jsp-todo/pom.xml b/cmd/jws/projects/jakarta-jsp-todo/pom.xml index a2162c8..c1e49e3 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/pom.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/pom.xml @@ -77,7 +77,7 @@ org.apache.maven.plugins maven-war-plugin - 3.3.2 + 3.4.0 io.openliberty.tools diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index e28cb25..eeaf8c3 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -100,7 +100,7 @@ org.apache.maven.plugins maven-war-plugin - 3.3.2 + 3.4.0 io.openliberty.tools From 914914cd2f0abfa5c7e8fae01b3bbae059378050 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 5 Jun 2025 03:55:26 +0000 Subject: [PATCH 33/38] chore(deps): update dependency org.hibernate.orm:hibernate-core to v6.6.17.final --- cmd/jws/projects/jakarta-faces-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-jsp-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-rest-todo/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/jws/projects/jakarta-faces-todo/pom.xml b/cmd/jws/projects/jakarta-faces-todo/pom.xml index 3c900a1..40b2bcd 100644 --- a/cmd/jws/projects/jakarta-faces-todo/pom.xml +++ b/cmd/jws/projects/jakarta-faces-todo/pom.xml @@ -14,7 +14,7 @@ 17 17 10.0.0 - 6.2.5.Final + 6.6.17.Final 42.6.0

Tq{Lxxj8l|KR?+YoJY6acW zDquTv<$150JQpoa6$gPRl`(99i18aak>$atYg5pTg-}X*k6F42qiDx~ylel09u3MX z#!LD3QM9+bG2z?Md8*5A#X(+nLxfmB9a^8wt&#E0Gp&F=jE72mC)OQbHGK|Jp{1eh zzGedDG8Z^Am@@J>oE^dd?-)adS=Kl94gxjBC8dfA$~!6+Ciwg8TRHg0>TO z#Mm=~QYs#Y45TzcPK01h2Hdnb*QH}wF_xTfVS6pxxzRcsolk(R-mE$J1Wd{6L<6SE1bhBK=b7wIoN(>&3O+2&w3|pgaAkCP0}bp|rp)nq zjsGJ@yU<1-3uM59{h&eQU?ZQOW_WNO z6VjWK*J)EHM5l{ejSX8luuUrxW62;c4JJ-Fov+~L3#a(wPks}=;qQ?;Mu}0WC_wF*CF_^hHP3TX*uQG*)!H`n)%|Te(t<)bq?3_QW|bDjz|f$?||V>i7`F zv$re8wEI0sX_tTxS=$YE+$D^4wQr@9au=!(0KT|D+9YHusYd23dCwS$CfB|?KFsJ>DVpG4&q$sq+-5ekE~iwy z6S8rHP|pN*;3#;BLSX%1n3~wSNR+WXC|I-nB})d~^egb9cwht=y7$F6GGiMBrvuMg z$7)V+6xNWP*>YP_#1v{Uv*Z2fG1EMRHO5l`dpGHwBIYu>a&|8(-3`$AWXWN3vMi+s za92k+nB1=Gxo!wjsob%;KIS*zcmqhlVvNsohExkUf_@VfwjyiQduSkEH`v2|kH9)i z$_2DwJmhl@T3mNk>jCf?T|;~z6}l%b|AzZu_kl6( z)W)Uh>6}(}5I}}{der_jelaVXtF z#NgFIGfku6eSAX&TsVHDP9iK#BpOU4ch?(ORPughu`=_F6EGf4z<>VN{u)j%&cWvw z*i3|(_aJ6WDS>zbaoHKH;H~ZkH4jUZ@`Jrl@*bnX7`kO%tB>`b3d8{9IJ~<&o*GY? zd2PJo#=B)A01yq{0!Enf&4`#>PucKd*u79cI}qan^t~r_(eu?LN?x+_6>B$%r9Fc( z9PI%0T&W=UU`hLLKt#UA6gEB$2yBPA)RPUEc>_jATn@4hG=c(6_1@|drsESeK-@S7 zz$HhyN!`iaCvQdQgK_RTb)w}#C#9z7nGSUN!l!!6jUY2(K^c%Q_n{WEx>|3wH`?j=xhd#1X z>f@C<%G)CB#Gp&V6L9<|?pyEQ?Z0#Le3w0{YoF;V9@O7L<>&!iYRQPNNBlY*2j@ca zRBIhY)IYD8XDF=-%BH#HsS*wHTG#0>MG z#n0M?x}=-5wz>nC5fhF3{D{8a9WO-?XuEn-*b(f#Mcz2J@pm_2HkTWo)1b{JP zMn1{7NEaXiuG}Sj^P}&>#~=A1uHVg=b~Bh5JIa`+tjV1XsM^~OioPY`bU*^Hmvcrj zFW2?jUPf6yRBXMAN4||)hPHoAy)9U48#97|?L~_}EW{-8`sk}M>E78vA09l_z#l2x z!l%)cYJ0wfLxMV@<@?=tYR>}p=H}91k7^nLLtmgvLd-^+);f3fYn35|0=rJy!?e)o zs8rfa?Mt8gdJfwegYGX9?wIQkR2*aRF=DNY4Y90G#eK-g504{!f4XZ(zEA8@r49pe^B?cG$BdB$<$^H?Te4 zN^;hfJbG?JLXLb(5asAHA9gd>MXdNuCIidbdq8~NJWJLK1#v@OX*RO>R4ZjX*qw+1 zl>{71*Y`_1*@58Lc4~o1vkP{}De}%r+it)c#w+E>KvUR=Q|of4sOZBQZ{~Rhu2NvU zOgu0?*~Z3uCBu?s<;mjtV&4QEJ6l?Hz|R@ON^d^~?B{r6R_ahTo=(RZ_EX$$5@@Wn zA5H%HyLv%M!JtWv%6F{U%0hd6i@2-5BY12-*->xhUonz6?*WU;2mkAD=8?i0=!V49Jq8FSi$X$DbtIT8E$ywHk<9+$m_(#^ft|GliPxa`$y z!Kl_3tnXu$AVj{lb@M`L)HC5n6f;3366&ZmIYwM93cZb8;z7R_k;DkcE>d@`&(*kH z=!OSrqcI2|(UXJ2pXCnK?|mAW;So0r-)V5qx6J3uBLCRP!{@;V5AKIj4Jik>l-wQ7 zEi`KI2nZgs1UzIp{ydP&T~2!p-q8BZ4h@x-s+LZRJ@i~rp}o`N>$R?T!I7zPG*s|c zXI~r{@-gWuAhas>!ljO^m(ew7>2zki^N~mKfA}kZ4QIP^qzt^YaRN13yc7)D2(&fMvdTu!XU4y>p}~PC-J}C}FSLIbxycpIFqT@m9|u|md{D3@ z<6D`e(7;8Pw??D3#hh#n9o*!G(b!N^3# zNt9hSsVLMj>W7Hp2BkX&;?uyu@K04TJbd@*|$$@_BC?iLto zK0VmdrXS5P{0;=NfiKEVaM%C1q1DPfuQcZZae09zV+G#K&x~yz}cn$bp5uTNSQ{dwct>8OS{c0!8qZz?pT+#cO<3S zZu`?*8Usw`Q)29}L*8V}m~oP~xcb5gJ}|uv|NdM5I3By$;5wIG|N9K&dSVN*)$QZY z+s#{-)5`HT9{t?%|5p*{Ewze9G#@v#(L2Yqxv|_1ywORi{{A>AaIazpI;4Nhehd89 z0Lvk2$K|*{Jk>2J$1ick=n;wm?IT<1E8yY})*$)W#Y1ePE0Iuw~QlJ%GFb1Q50w<8+P3w7z&#vW{d=8^|z zp*nc+Vb98GC{-~hfGLBq$9CT11FwH0{`Y_RKf=}X3#9XNOcOBET;hrVt;qu4EknNn zuf9Fz7mM33fZ~Zs?(AFn9{NtBK00tKM|1gQUAM8qHds3^l7hGjWn`m=;%~0XPq8@vy#!C-U< zaj4mrxfO7_5$OCj70g;=7k0Tz%hfoDDUXqpBX#>R8oH;AvOJ$v`!0%c_frZo}8w~=pJd}mcNEq1l~s!j+Wd?VXyRiU>{=i zos1aQ(f(>1<=XHECnaj(1^1-K0jup_F4BXlIOeogr_3m{6D};W{eq=c=05c(q`=RKK9LvcLx7TPk9s|B!&CJ(WqEOLm zC`vr2=Z1#E6dFfX>W0ifJV$QjUQvwom08zWj=}4t-?qa)T?5Uh6QWSU12}Y@`U`eW$Kmj+gB_7RrZ488Qq@Rmj(-k`J9SMQ` zY)YeD4s^q!>DTmo0dgH)&>B5p^}J=3P-8R&zlIhQ)Jkr-(Ui3`jw{IYak$baU#+x7 z`$HApv$fsl{bJuZ1}sLb_Ra0?^$icFoU}0x(xh+-NpIN(HLmAH8^90taU;)$(kr0l z_>(s{!p>U<4ueXJtk_Kt>q7;^VaKqIAGb6Pb$KJs_&`CM&D=z03mr)V^g@%7ok1wKKb9<7ZZj|o-XB? z;+5Zq_m-@rL%sIZ+lKP;y<^*j=Uo0Sh+=TI#9;&AQrE$_gaxkWrcXKQt~?0`%g?sv}ter|9g2Ocm3oeYqJXpX#8tR)996K!I1+SmcOeW z&_OYrp`PM%iVaSlo$>8AK8PQC>f?Cqe8SZWE~kM2;8f;ynITQCBVPF1er=U*KY7qz zd>J`8tmDA|A$Q-F1DdbIW;F;q||L7dYb^o_>S`e|*T zwovVJh<^|NxcltoM|el4DocBtOtK1$+kAeZV{6v}0hyQYHJ#FODcn5tk`ahraXWGs zjLdyS6vwW^ALx}!Uj}H*OBISC6-0QXb0#;nkDeL6_%eR6gr1Y=*R{LE>n8pwk{IDL-rT~B-i{?wa3jz@PBuI@9yGiGo(;;jNjiCZ-=vJM=$ZEPocy=-kY$7|uu zdobgE3Fc{r0)377-*?O&7huq4mX!%xm*UlzyPNb^;_lfeA zWrUH!{Bxm0usn!ym!gw(t%7Xj@tWt)H}V+#HXuq`q~tLUrz5NdzfoaWl&xH;^El3H zb!=D+k-_pt?qHYCxK(4w;+4_Z&w6 z!J&5we(5wzbYnNIQh^=v(na%O$hN8c<3z~3N1FF|>f{vv*?;(#@on#XH!hxk9vcD} zb0JkOK!SKG@msR2S|_t41{UvxWbT9e+mp3cW|RC2aM3tTfTpn& zxxbNPJkXIojSa!}YK*G@3~FB+5AQIGBBP19bcT*LpRE51>fO?51ESh?95mn-_|DkF z6q|x}0SK)Ol<)>M#p3we=jKi1b3K;&7=?x<+e=2K8F|Xs(*;f_;q(Q@cR%%w_~EC% z4cE^zwio+yG$b+d#5K=fyTyRJrmSBc2{oUaS}uu~zNQzg-f?o?>?`+=9oFSx%`H|5 z>9ZEdYO~%sD-?iIh!-sSU_rmGsazfx6W$$ZaR4R@eR_c)+kL;g-j`C%&j)!!6s7+= z=*RH6*2i<`YUmIJuE&vhkZRuyMRMCn*NaDjMb|*PTcNf(*O1E zZN5nV$G43-@x&G^d@jt8Wk)S0X`1M{x7x6#wLx{xz;Y{sivN8F^pR z!w`XUHb+U$)&}WMz|n5`t|f-gQ&-8Lo({PA(*a_EZn07+&&~V6H7qgk3TX-zdqx%8S2Le|`y;zhcsF~b;Oa9^k&(@YhX&8L;EMY{B=3){8Kvc6Js1`$B>;!Su5fX~x%$8dP!8sB%|2^qJhN$8x|MVB~nkGP_lNtZ}oY z-Sxho+R}K6W9JdDZyJEIluU#~K+YM+j5GoJoIw-e3a;VoImRD*=G*a|4}Sm;?HH#y z7XvL74{QMujFe?QFopnpNoEtHYZy85aZ~P+8suwp^^&;1Ok?uOefc!n!qSn+Ib+1> z0yOiz1xVffK@$kZe@mj?HAK0bqwA^bK{#uB4FT2n*HDH-nqE$4Vn!FP;oIBA>@N9u zI$g4Ge^hqud9DC(t-c}QmhLw~R`vaoIY1GibK>YK+L_i0?kK6V$y?&dSh!45Jb?njONqyFqM7xJr>igOqBZJMWQZ;EZSd10ZAH5Z!?uJHyu~!JZ#oTiQ0W<152< z?uayf)_W}*gD#+c14VIOlyWxI?57OGJHqa-lA=c^+CGQjRt=0E?Kpx9*!Fx-6*-er ziS7@9z~oZcxN5o5EAmn8rpEeN-w1?j^C_-;Ipa^i_XqF|*WZDw_cG2hKxu>7XJ_XU zpKJ1i>M*ekozA!7k&+|-X*Y9%Io8G&DG7S?zvDCxugHU&0O^arEx9Q zI&{(sCS9Gd7&SWl*1-HaXW;8uq@M|+mV2ZeQPZaI{9xoeU2e~Nks0L)4qqcCJ4l=O z+-5ZY*Iu;9*g;Ua_b$wW)~gt--D5h@5nteRQ!xl6=e*Lms>@B(m~(H5{>x<|@)@#C zn^R%&D#TXLM-_t2iA-aHI*$;o@vEOaL#AA#g3FVr^LC|gjdBX*UEQk0-Gd%VRsDjR zL!|&e5m57t491iQ=lctsY)&!lFYu$^@=bW+;am8>|NZ|KXAeJ$`}N?s4NYajX2vv$ zfM{C4E{nY+_4TnNEeOo4z=Y+y&>8~JWN()M7MxR>L!<`oB^DG z%%y!|ELNG47$tO4ybD4vFS~%^DJFZ46rhcikf#fxH&*VeeL<@Kx*6AcJ{_I3YXciG zwn;v*8Sua&{h(uD0FOC?jJg4s`ZzN+WR#CenVfSSyAr>**-yBYui@%ffWPn!Ka8(C zeLb$+XKZr;!DZ#yJoO3WhSH;YW3hGZ%KcXdMs<1~xW2Y<@G$sOUK%uGj5p%MSzg2Q zwR5x|+ETRS{qy6*&I#*J2RQ~2_4F_};QNB`H_n52&yOBiOYOiLR(72v@yJ|NHhZq>F=I{rLv_u-JtG5Bly$$U(G9R963 z+rzMNQ^jB>Bg2+K6C)Eqn}iEoAkz+McMsqGu6Na@%6Td-|gkoqrkY&=Li%ck$I3jC$rlfT4E0en;ay#zFCKM&Jlawf7bR=&9NuD zPu&rB1jzZR8oMZUG=hoQ`Ym$~?B}23S&^s=P2(bT(_!YG$8BCG_}SV1Kd==1*_Xx` z{ZVk$3kA37r_wLa(wIK&OJGjN@1=_kkNSEm@{8=;$ON3|v%y zO`97=@^!d5=ko&wL&%NY6y`c*C6=_+Nh8pU2m2Uysu} zdu;ZMjD$H?-IuI2o@WN5vNT%j@;A_K^u!_Qec*ntFfVy6*Kbwx13VeDZTD%lOC3?G zr+6(xxoZ@;zn7)9)EWI2G`R1Rp*#NIiX%iWDUbWU^zAO~G|QOxe933p zG7TXUVDef08}9p|_kx@I@)GLbEidKa4foT6wdspTE5l_S59bDt5dR^VeduaHBOeqW z;T^Q_`-8M3ShpY7K|&P%*@KO zIRSGb?3h6bnDQQPzHt@*xBvBjiq~B^!RG#5oPe?CJvafJQgy%)Ql^?ZY)PR(04SMPtOIb8P?{<*YE!Ae=0b@p^tk}*Il0NkTS08c%i78~CNB3H zXAk~VFaUJ;hOdXaTx6!V1#<5KXG${{-S~PTr2c`r$u~H(XrB)r&p0$jGuWBv~S7QiW~W z+>6Dys1oip-4S|sqqXwyRbGt~W8_=9TxI?gjsxhD+b0K&8oHP~thy{69JRfSZ|Bee zD;`Ry9PFQf50-mpw`d?3U~_Lk0_Q(5anr@rjOuI*xnpdI5!+S2_g4TDcG-%UZgB=25L6GDfiw>g zypmIpN#e=N_54*XZ0q3#9B`OKjYeSS~L&nHW^mK)TkiE{P0$<^{~So)D?Xf#(nTe9{i8j8@D1ON|Jl3$7#_Yi;pz^c%*D_mlqF&+78JY5W7A_z;(K{JItI?qkq7fX zE%U?pXP=Ck*Nd)HJVH?IfG)h>-KVZF4eD)y^Pu99q8hz_cuI(GS(QK0vv7bC5yZ5Q zbnSM09*_7Oz-Uq9T|Q33He_Nh zE3QUtZL|oCPD?fS7T)E=oC#Ck3hpSk@JL&PMuiWz&3YeE0I`U9*_~EO5eh)bki2P( zgp3VkT+2KB)gSv)c;a|cp#)dJ2QYx`Xfk~Ygrr}2c zB&}fc%Z0Y-f^9Oo-NQ0b{Rtj^9~m-UTNsfbxG6!j}2guS40JLGA!mt z-tXpQD@--EQQK?m~?%WG8Y1K4X&s8K9&Dc0iQ-XWHG}wY*MKE<7W$M(E1A zR_)ynH71Q2n4~dmJCosdXzQ4Z7uP_vaWLXE_m7e*6=E9Mu_9Z0l|(VtDoBIY6A*aB z_@D_}4LV((%pjx$$%$`IxC+@?Br>JUi8c`zjmLZq+_ha84bf<- zE|jO=-rWmYJ3t7E9bO%~R&KHvIPRz>L3LaabOnHn+&%~Zs+`*~%S{3`24R;c+?^Bl zl#mGk&BaQrWho^Uz%3yU&pCTw36QQn?FyQ58Z-2IeJwqF9FiME7ku4r>J8z%ZekAm zvMNyd;4jC@GEo|l;U4VjKz-d=rk;bKDY$zV=ZtCEVvmIR^c27Pxi8?q`rCgSyX_Wf zdxDt=i6$gYnCBU3n~-_dWmc->FG?}Fn7)iqz{j_Gjaxrw^`HT*fuOkr0awQQ7;TE$ zSBAz*c?Jl*7nYQ^d30JgKu{tDsW$sa6YVN+NyUO>4@PM8emRfW#=f(*#6j@^e z)U0u~b~LBB6pt-Aa)=ygcPvtnf4b{c{u-y$;W8^Z%)^HM$`)>*hRWI0PKP8$iv`~B_kRbvMI+8giKifSEwSf+sXWJsRCL`Wph%_851$mM3{Mx zL=&c$Gv1gV#$Wh`AI2N=4P3d;I0XSnn0W@Kx?G$y5+$^`UDpiGCEd7w`5IpnR5omv z+G~y$wk_RRxOYi_xupAh6UV*`H*FjN{zhu%GP+~+M{gkNXeMni(+SQm%DlXF zI^mRe#XC(&=e@3GNaA#|R7m|$W9?p}12I&oYvN}1tLT;cG&8*O8d}pyohb*6P z|MFl^d96Op)#CtyiW+vcdi$A)12mjT7{a@qvUU&|h>o>8Z zgfwkY&JQj}wWZ{m9RQsOj%@6fD(82Ai1cCO5s!idbU@1h25dMvV1t%x%M-HkXb2*t zya#~3jSPz?6os{vTQ}4wOJ@c)2WZvS+E@L}0fD&8F z8`uuxZ1!z53>w~ZL_OfUSiN4G6F%I_JYNl(dl&$&>n2{}&%sy?t8HYm>ib2IM{!Cl z8Si|Uj^3GZNFQEqRK%#OhVYR9&?7Wi7#5>DscpnDEQTCU`VD;yqzWpvmuvd(YjE`d z@Cbk>zYPJ8$d3jYsRvLVU^%n11%R;unFjz6qI5(cvU&jT%v1ni0)V;X>=6K%l9!&B z^t>HG%=-U!!@TP4pkS7)o>41Wg|S>@@n`iesLLdLkD|S4*`h4*({;HREj`wPKoRI2 z<2@(ZE@o_ZjEM-CfmE%k z9Q1=5n-Pz+21QfaU*m5^$YApOc#6T(2d@S{FRiNaLiuCg$A`)ex}fPPJzoyM9O2Tv zcG%)LKqpDW>4>tIy)QW^6DFN}j1!#i1OO(S^1cCp-hd^QC8@$eTMqX6kjrGPa#?7Q zkOKYsP_Q^IuPG25@S80G*8)CyyEO3Fohq%v#uSEGVWhcc3JNbWuUY8T1Y5w&Y(h$O znDYRZr>Y0A0f3Adsd@l00)VcqouIqq3IE8ak`tnCa$Ylz8;Sz|vnt zY)ge&&cyIH?w)OEx=84zA;aS+E_Z1Pjs|EDYO+|@C{ zM7Y>&@T*_=Bm6)9-rvDpPQclfvdfkkmLo0Oo??bzZYp29#xF z;}elB3Sbw&U;n*A%x3(pt!<{wSa+KULyip-J2NS>GAQM;gu5xbcR6LyG=X25@#gd> z{^Eyz7;nKNxPCw5WM7weksP+JvR*ukoZ~ojGHbv~=q1;Zd>y8If2|a^>W zFjhulu{+z^e{TnHpl;0#0H}FWvn*l)oc3T3bbsCSDbqE$o25en*FYsFm)5QsvkY22{SXUaX z^(|R0-t!PZpY>y%DkHZYAw1^34xU)NUJbvS;6BC&Mp$|q4QgF&mnSwK=<5*@uwkr5=yMHyGUhOx-Z;hrU4>!gQaMmv=8Jr1!>9pf8C``;r~8sK;WLn zAr|t1Hsc?AOJP~xi|dfnG88bFm6$=9Q9>+cFf#I#F{c@sW^5(`zi_Mi zU~P>l8Rwbc;sM;}33p~-pEfnA^<3g+U@?GW582Vfa^OihqqX;bm0wKK9)eXPpIiHV zX|P8AxZxm%A0NcicFE_49X{sy%e|-iHbU)6|E3wHHpFhrm;qpt-J1>^0GN=9cOxa- z;|c%ZXa70=(a-)YHjg}vG;NUQy6eodF;M}P)qBJBGu51d4Ag_~?O(x3a-u~`GVUih zK~LC_B|Ku-&eu*L#27gq2n@3=xcLi6Vr-xoy5bpBsyhO7UcPEn=yD;&_juq*MDBRK zxOpPhNmh5V-NJrzN?;Jc>M{%#c*f}JJ$dzA4ZYOzXYqq=Vld6v(+u90kcyK%aN|Dk z{qOn?eDub<@DNY9dJaq(Wm%3&E<}a^cSAj5uz5q^vX_y{O9anN9GRilO6%9Lf_>za z6Zt*h?@%rIYP^eQ(1ellXxcaOfy$pyGu6fomjroG#X8l<7dyh?c+42AxsF1CT$gZ} zz;ufHvIKlqV*t^{06GJVW%<{L)P=lNLpj*4`WqRDKc-Wc^TAx|8lDBL?_FS?R^BYP zQJtY(p;+D@8-&112K#{VY?1d^+cXNVW%{pV^aLg; zXfT2FZ(URoubTi#VLFFy{N_y!9}vfZY$nk#4McAA#0BLX@G<@sVh#fE^g5`_!WY94Y=~UHscf^U8 zifjbd_&_nD>(C|Zr|!0HjTKzGZz}VDs>y8MrT87E&BRf-Ocef#x$kTjRlfD=*0)VNF1Lv z-R5>21J|Gd-X&k)K-{_qzOM=L9W~?#kXB*<7hFs}EyoD0FBt>MsErvSOGu~+S`x%E z=Ux!jI_KsnA(Fa-$S6H4X<&eTnvjXW$Tba2`J2qu@PJnXXb0oer&uxTxJ>Fp@8|AY z2YdP0r1ny8P83cIX@y$=Z z4?py-@5Dp%2~Ku1Ho1V=oM+IMkTc4Ly~g(Hum#%oT<%(uYUY2X)#p~<`D(m10TJ=Q z^S@koCq-Mt>h<%eo(>p!1T;bp3q%~Z=7CA_-~hktiGE>bBuZ{|=LGk62^ox=XB(XH z4jV}NuB0;1oC%Di@qiowynp}D1DNdl8aQi#90uPHj>8eO`poVgdl1*XxAn$R-_B5B z6~=v#r&}7UF*^PX)DZwIhka)+q8$LtT0d9KwCAa$fk_jX2u!&saRq=02d|Y$*25E{ zzV|Eib1o*tJ=}m;V|SOApImtgtFu11bJk3Vh9HMb&vC%e;K8NekD-^DX`T191%P32 zoL7l$zyw&glf7_{?YU-~H52;LCUJU~_sEnG$Fwq%^6* zXY~Z-3N~{%lV=P72SbtCLUJqHh6vCY2oWsq(L47POaNi++kFqT6#>Tr(h@*^b~ZFu zfyfK}ivuRHfRb+uEp5E_O8V7umd0H>U>CHc^;2?vc|Ho9sd|wHZEu* zl9`pNWIRngKexAJSY5XMFhcFzlT!*kuQ)n-k5YqLSHYqQRikYryz`1dlgbq|^d~Lqr(5+FlI+^j^fnH4GgcsvbO%9e`s3>Mr0Jj9X_L zoaSBF1R_Sc?9wl=Fgasrw9N=+b&CrUgPnGvb(O8a*$|4ZlQRheST|5`JU%!$NDQ z`QSy9LA_XESp1^mUE`^Qx92(IWV-?8x$GC7HrP?Zvlr+1hyUy+@bka)t2nv-5I9ZP zWd=><;GMFGF#(iodK#{&TTIX`fj}|B!f*veZN`)uS%Z}Irf59b1&CBnh?a?ISd{fGbZ+!sEKhMdQtyZI}AfXh$&h zbG6h}$w3L4$c`;(wNK{V0pq5Zai%(trGK{D0piBKsWm7(Eawh%0CF z(x%8;Fk=EC?HD)i0q?u@7W~Kuz6X!(uHfuqj}w>B1u22^TmfXsrB>o7*~X|N!LjmT z4Y4c$KIu5M&%Zjy-rA+F3ZP)Y0|;mDG#KZo_Z%wkLBmL4DdVp^zfkFls5rvqF*=iD zRF`LPR|A=rEI&vZ7)d~Xg8RF|gSXB$ILmuX3IJ2Z5##_MH8FsqNd^GWuB~Wulsa&%t0G|d1#o`Rs zF%$M^Jb)bl98;6p_8+-jG_}(^#gd)G0Ysn=@F0+2PZb1itYbWU7JUzL)eb6rZ99di?X=QxPGLfxz$} z4frCokC9+jKgSmim@(4Y17CuHaOEhKiO$1Fu}(^UUQzds5aWkWj62nk}7fNauYzdraobZI{PR5gT9e?uuAH(}^ycs9=GR~Ng=8Uu<%sksW z^?YsUZg{S{??=Hl#{h}re0avR9RT!W`!%?t9vv94&MTq)yd(gWYF1P6u`4+ESza4G zvDRklCYP_F2Z1Zvqod1lbQBcbyq)}(AFjMx+~Gw&Y;kW_VzeJR+tf5L1?FkY?jit$ z&Ycbq1pruxFCM_5v(yuK^cREAIB*XubwL2&%7}#Wg9;YLx_o5RJP3GyD; zNWrUhj9k-rk5Q+&|CyWLS1gS&IoBd8Bb7&1eB7wOi_e5z3@{`gPe7eDnWOxLbsKPBuF6>nQL6jE|| z>lzPObTko$UMCp^2ZWY_mwiw@n!nvH)W-9tXli(ZNBO;+uTtr#Kqfm5lEm0mEH+kG ztK5QBHnPw{z?dJ>$d?S%B~V-97PX|7e61%1knH<6V4cCcxdGPxfkKx0M$V!AVP6T^ z7{+7r90^)_c=qrBO2$^lukC~Jew#Sj#B0skPzjk}N4qihNJu!{11B%d`1m`%5g&W= zhw#umVY{2L+2^V+4w_@Cu zmASFn zy@#t5_M1S;vjsLp0LTCm_B`S49@x>Q0>Ie;Kp}Z#E$Uy{4+^`I4Gns40@q^k9pjN$ zrdjt(Xv?ur0TO>ehXzr>+~_5TILtjqE4MFEsvD8&J(2)AovGw< z3Nk=RyP9e&6ibdjsz(H+1g3;N6KFcaXa4X@_;3EZe~90I;d!KoZX!7lj)p1Hiz6U*UorpHbz8moqLrBgANATCVulIdGD2lhL9E@M9TJaGXr5liHeO@| ziyLL*n;O0_;N1zITCPp~V#YG5fvxa5xwaADjT)^>!Cg!NV`nHgz=VpY4+7jXBW*Uw z$k;OBBq!t-?%`cG--v(j!{3cJPB(FSzDL^6*iI98u5C?(eV#3?PxT^#OJeqriid5%)mN=BA!*!4J;%k1n9pQ@&SO$N6$w-%DalvvehwjAp`H8)@Y)dQkJ_xxZ z05p#yw|6PmsWoX1R?rsbyM&w>x6ZaW;R{{SAxaJa%K6h&r@5P#O8^ihl*D2H&9YmJ z0c|$x+O&IE$U0#{)y54vGSsxM6@Dc{F0Z6V)BR93j?u# zOWOw%ETo=>kqNnmF8y;WVnA>6LBvwCMfj`G(Dc%oc2|!N18%;Hq&Yk@$8ziDv(#E3D*6qYr5NLI9-4#u`l#B@E zb*YxMK61BwIvrK-6gk9qtt?ZP&+46Qf-F6i0uQUjPHy?uW>%PY3dG&{$HC)DCIf}R z$Z@r2D4%;!=i`4etDRqH=4C*iEerEBxg^>;( z5cbe@3U0GNN4T%4sRN+X{1o$hEbbNuhGu6vaQsvAAWGvYe$!iQJX|F@VWpiy-r8MVqcD3*dkxN%32KrRwY{rbdC1lJZOz$NYP@<~c6CS^VzRn(Huc_6G6qfMeq*An={%I~A+$$cC8jB8*n zp~@xBAhK`<&Qu1DT9N;tbx=g7)yk zAoj0Ln8n7pI>+&%$JmT58Ei~+qT1PIwM0r-qi5B1I~(S+SEHPorIs~ewn??K-XB@l*j?m$aVU>uRz+H{J6VwhBXgm+0j1H z#(5}#{k+4poscPGPZ<*?Y%UmAZfAV(b??OYf8Dp>seA=jb{X4@8aja@d#UUQE=#;} zLXs&|b2YY{D)Mr{Xp3DAKM$n>NxKLpiQ7tFtpI#Am+!CWJ-~C{lFlEI=D40LfFwhK z3l%PDFYAMR_Yik9YdSnK6yHuS>*N{HL{WqqlYJ|ad$FxP0@VY!OUOCn=IOSa1d;^Y zr2yvIqaFdt8gKvrs=>OF24;!OUq$xpJ%BCkeFN6?>&O!|*i_H~Kmk1LnBTq6VgM_# z#cELySA__p#sJnO;OYScWu%Ju19gS#qWel!U=NrdL{K>8w?@37^U5tSaTHvmlPtP% zYLv`TfRPsJ!Qgx7&N^Mp%j(*3a<3IB=_`~O)!}j_OTqGbTLSn*%q({d|{y-1hBw2C+hxQKhBpFhZ zZe&SALO|z1GP5=Sds(`ZM9*$uo56@d%h=tij?j438EKQ9I0q_bmc-0&j z)E&AyC&<+snpn#_Pl)rTQKyKEdxCMM;}pRlNn1SDu75>Ykn69~Kb81FT~@A*(@y|-jR26!CZHJ^2_?2KWgDN~^Tu)Pop|oBhdqL0Zh5g2zkKztcK`As7=Wu_Ic+0_O*4x|9JMUIuZcVn4{*}xQq{cI2i;I0i zo-=NpRRAcWA+-Ro{GOa(ky`o=E(5@jdvBzO);vW^`g*OtQF&Sbfc9Rm(7Kz;-$%98 zwX#C|WdPV#kx>)#jsTzsfkObeFS~z70I=(T_s_NcGRhqf14n+#BOYl6%;!Keym|o4 z4Vi!sGt&}Nj_wZ!J9)YwUiZBkkpFgFlb znSr1ii#RhjQ^|wI1k98{37B(D<~#wrJmbpt6!V=6Z0}{f;p`Fo&sB;KDgKs9X)yJdJi5y}nM;?zFE6EZ3iZ2PYv_&e@e?u^i>)7OoG z*NJ&iT`OHR9v!$iIKI!m(PCYf?Xh=+9I*`t8unCQNKHNMT(J*MBB)W}V4wg%CNM<+ zc)~kuok8OPpwQ@08W;dE2C%k?Y97E2>^|2e;0geNJwVy{WTLQ+*T{C@t_abQqt(?$!?9Uu zLTCr~^L4C2mn6f=_#St;2MJi>HaQ7K=@sf2P+b-95+$n<;?D);e30&98A3ew2LJ$o z07*naRF?9r2*t;tEsSy?RO^}OyCX&kH$av`Ig0_|;uTS_Ou&>d&l#9b@p8`iAAjwa z@sq#!3wZXW7qPu^4NMc}l)#*jQVL5Eg*Vt8(MEO(hhip)hcjdzrYZr80lsb%gmx$S z@-|BPIF;DN0!;ESr<~Dh;2RI+s^7@vD%3d`+U4SZbebE#ny?-u*d>#3lC)VpdeTY{ zYPFjlTvL3eS^73WXfJIgo}NPDmqweVc%@cqiZ0J{u+=|0|Y@-V*ZJ>P^6Kk*Jcw4bou?J?D)&6dj*HZLo`WaOISGS!qy;F- z0F2(UNDFWLEq9fPb+^BI3_SqE7Q1;u-p{yoWs6hnG07`kCn+p5y1D&`%u&&bVNN1b;mR?iz9G}dyD0ru&g5s+OP+|bN z=H1)##yo%ofD8bV{(nT*K5ig1#Qm0N6hm?pt=&XumqOZix+I(J@mtO_65LtCv*rZ7 z^Rf&gTvnP?rmr~&gJsZE<1u42#n381n;?dZ>fi!YP8>+O%()B~Yi+e1&GIIjM@A;D z=KmXvW#`fAsQ{qnl7dafP8f_fH_Tje2Id(Au4k$OG;Oh)CcJQdj(_pVU&hb;;wSLj z-TRoXUqzlK>~mGVl9SD+Ng>!N3*IW#UA1oc6g>9YDO&P^&xX#tc~aE+Wk87>$YlFm z>j^`sz`PgiK8A4Q#4)eg00cVJ7d?CCRkUa7TV0Hw@Jb|sWxEr98BL=@71`>_HpEL8r zP>i(iYlcDx*YWlGgy;{dlKV0b(61qgYS{m1_!p}rGs};<3IO!R5C9i)Aj`fKo>-!R zOHIRKY!v{w-%rT%jEAmlae_T25kYwqXHVGE20Q`4 z9#nS=djJ?%SDUE5w$K$T$Exr~9-~7z8QuLA6M)-~jp7*rmNl1R>;1b7xA?|WQ||$b zc1&mgQv<^tPBPhDDWEBY7CYOtWT~?)$m{QSy*Z#OI$;<*9Bz`6d0~9>WLZ(tU=SBD zm^UYQ?*0xx_iz3Ue)^Yw0bjZQ3bt3TVNVG;C6s)+ejhzl@rR+RDQYrMHxeME;n2+% z4X}vTk^pBwn7;#h(oWgHVAHebk#_g3q=?}PxTs-FKgLvK16;q#XR=^#_gkF9WZ-o) zHUZqZ4H~FMo&seL=DLB0_|hWQFaWHzc+jjK!SQ4iL&sWR+E)OiKJGl*-gD{yaYB`q ztTgA8K%6ZT!+sCk-Q#skNX;WNxfo-zb4o5LU-i-^DTVv*1bv)*unw!qk8D- z`+k`xftvQItxk0DVoXpxg)G)6IG}FK!xsB_gS_A4)|D-`D2bqDUMc6O$Dj3guqAfy zl*BLwkW_v-Yw-B10pffdYc1Cm0HE_wXonbzRKo`Ek((!64eD?)faNhp@_7I`H_v$w zpxsK98#C85Fala3F@ULh02!b?2(x)XI_C01Li*mJujZj83vx)`jvAf6$qT;0U^eJ{ zVHBHN8WkM95SK)#C_7dns)0BrIArg~!x0Lv2a1#N)DC?3Gs?e;+!sK8XZd0}m$ z^sY3YXMWkay#NgOP>I9$#!YNE_cNwDGv0dZDSXGfKZ^G~ z`WD=pH`wfVz`QSc&~nK$DKUIHcCP;si%GhdW+9uLSPG7V6*1F|y643uOhf3oWeNPP z3Axu=#;w=aW_9R1qnANi!P-8y{DL7q7?nfgbQKKU~tu+D=5Bo2?VN&Eq z;nb6|1iatlp=&4D@I{#?wXC?QKuL`-SpqfyIC#4Pz!(FlbI7l@UXpITgX2gT7D+dV z0em$s#n2pInf+DqEAG`Q3`Q}47yv*5$`UYVJ(m^r7_XT(V-H}BnZiIkXe-qtu||Mp z)?X*v$Y*OnW9h+HH4I(7yk7RGi&v|-%pU2rS9EDfR;z5px_TLpX-7OH>c|%^_P%?T zmP?!1sEKp6&30G5W?gcviJ;R4_j1OkKmP~#nP2)v{F~4I4lbsI?b#V-5O|WE!U=Nf z0@b9y%o)stDR~2?D((qtt!l~xJvNPk>>L6j0YmN_*I3RBI{$I6Ei2+87M0F=my+-Pm#Sp|@D2nB4Fsl}>;DhN5y0sjw(Wkxa#lO5{ zTl4twv89iDO(5)&LXo-Ic%MgTqND6z2RW*NsBbq?gT@g!rKMj zF>f)?6Xps4w|R%jdG!-qh=|+$Pg>&v0O*gi)odhD-XBY|CE$1H`yx0V<^fzYK@QG@ z_35nv%L3-ag6DopjCTQ-YFSP^s2)HDka>gKyK)vVGzM^1Pe(7vT{D}riPf8N#1M_V ztv#7IR=6U}Sp7@&ZyoZvyuTJ`gu0?2CP;z-K)e))73`ajtvOA5#={DYi;EC7Sa zjAU}})6)y7nR5;3G}-UHXCw}Q=%qwEZ|f-_^(6r?jufrzt|bSLDAK7s+wepKj7jO@ z5`7CtxU?4}371i5m>8H+$s3tyD$DvApgn_j8Q13%eE5y;#>e0PQ9L?b!)eY)7w4e; zj7>_&JQu)Nm*}V3Y+b!|$hm`CYtwpQ?;Z~-s#o-=l5MRttZV!Z|4je3*A@VdrR1vu zfWDE7$^U80w|4mR8fJY>ui+?oL&MXk{;sLOe`ef05u(w0{N06QE6;6Y;ml~p1D9AQXD@peBpJUCo< zw)s7H0Ac7Fssy4Hml0E-=xfck)|)eLaQlL>Pumi6Lpu<%39iw^7DXTc5Y)KjSAfeA z0~N28JG?#zFDEodPqoVG5=|W7e^ceJ;pKrKj~f%|Ysx_ZXnRy%L%H7fyVjT`LM+-- zjb4vFC|apeV#|6PR-q7pvT=%Xt{V>sGZl~DOoZoNeg&WSjo-x2ed^coxtE^9E&-=k zuL3lcautMb50IC3Py>l>YxbqZxR7h@do}j5g%j@{ymC~~B*4WR2Da)U zv67RXrCU#xk?81}x&;%eA)T;6LcYj2VZ!zv8RAim+v@4~~h0qu53nQH>) z@?06uTmWE2#)(TLjgFCcMf|Xn^nY~Tc{ddz8l;B{b?$LV09( z51bu1EL|2`wVX#95F)6?*OoW*}pO+ZP%8bW)c-b^v9~1V9h$<`J=d70-wQA}^3D=&7|x8l-~TN(E(SC%`;mrU@^D@tH4u z5kLQ{zl2}^-Ou8s^ZVGIT>;XB84N1E9j%uXNDxq$jmvGW&iM?D(bG;+@NSWIb&&I} z`|ANmSC5Ww0|NcBQgA)g0v^n{&i?<|`?n^^ zk|aG0{M3#|L}pf2_grup%wh%*f=gh9E9AcI|9@NAhb6JH#1aHX2!H?q%mv-kT~(PG z;eK=<%+&N^YIcrCL^TGKJtbM;?#HfbYO0^AnWZYVSFa?^GIjOzMhUxhFICcY zpI`lDqf-08T#eeI_o3fV@9o77T)(~G^1}E9eZ+tJcmDzY@BiSx#ee<#e;?n|Bk1`n z9%|_Es9s=30zr5fNKYu{EeZz(VqRq4^1Aywpl6Le%VvVjA0CpphbU0Gz7#v=y zYt6jK-X}$kgTT=PxETD`KMMfZEK1_>8W$0?`CY)Q`+$VB0sy}?0Ju^00QNx8MtGYe z*!^UW^)L>UdVBxx0!f_Y>^k!`7VhM+O6epje8<{bW;Pssj#}z{%m7|ABxc^f_jtTN zR6r4p3_H{>KbJP9BKUXW&~CdafRzty*pq$l`^xH_*94Re-?oB(|Kkt%AO872$N%$x z{2%e}{_-zy{qO*Kd_>tUAP{cM&07xeUV1!24d%>RuK_nCOSsa;*iQqlX!x#xh{5gF z9*h1ZJsS{ZoEZ~7iFfsK^SFt^ljUT{_7Q29%O=*xXfg}XmUjE`4f3c1OqFv&2*1ZQ z+TXR2y98SnhrwR&M5?E_>lJQPg&yd}*uOsGJ3Qha{_Q`;fA^363I6fl{!{$j@)4h2 z82I*#$IAuGw;E4#t8q1fdbOOyq^wr7E<1NjAav~A4H_z&S$3<#E1ztP>z=L^0Q}GM zL?ue$S8addnK~u)&eSf<831j-cO94y;_KL=f2&4RUe9-2MwMhw&-OdSo$g<3y$L1P zbVk0lRE!I5`vrV`!5@70gmN_i5Y-UYd)bS617QH5m07(?IcV4996SJ&_OI!5AIXeP|~ZO831g=YiqCy0L9*~e|O{n&;mxydBIQ5JD%wQdm(^s0B$J#N~udvW#fw$v-FJF)0&;BO6?;tQ8N%9rT{{YGR(lvs{ECIYm|;${9oU15g}=!I`mG z?KJfKbCxo%eQ21fJWH7VRQFgl8&YEASqly70k<3vIY4Fb3ZtFo-K#H+X~Pv8=;4AZ z7yRqL`b+#j{-^&B{@?%Nf5s2rzTq3+fQJkAhk|F?>qQPsC=EnPd@GivSPA*k0it%K zDimGLbsMJ1v#nju>8Es4i6`?mgp84L3>edZ)Modjz4gO+`*w7Z9QHQG;bS-XQfFQI zxqEB{@EYW**Tc2_dyoTd%C~)QbO)$42y@?qv;&vt8!lgN_@nRs0RP=T_;2vv|LH%* zAAS5K9+7bc|}hd zzXklgpQnS9PiZPTD1>|omi(#M?;?jiW7-&V*5M&7>|YbU4`dn5p!=zOhIUpD%gsvm z1Z`?(X<_Cl0nYvdO*mr>Gg6p*aw-@~3_a9KMFExNUZD6!WOT4!|)N;U%`gPkL z02;q$+XE>6rMUfsouxb>_yHY9ZGB=u?D(dKK&GQL^m5Up+|n7AfCm7mUEwv(Y9~+pp4gv`n5&0_Qp1TkGaW|Dsnqq!NhK?1r#cz?dLFMpIQeL z3_zChsNU^mPNkOZ0lZ!Cg&F_$KmJGjzy8_(7yrYb{WJXAAAW_GPYGrIwID3K zy~`S&JG<|xw=;AYm!o_cTbu=bSy|a34+TIo;l#cDKD&--*0Xt=j+i<#5Gd4i1QIg} zV(egY{hwZW=xOc`k(TZS?4SmK-djnKyORq_+sF?vZQyOg7b5)Gum1x7^nd+d@K67j z{|SHb>tEyBegl^WVB0{K2LM|YTKf*ZRZo<}QW1eBas34FiI=TN7#ZsUB(x>W1_0eP zX3|N`L;?gwXj#eEooh0d{zjC6^v&D2Q)3>~!?crnGa0AK?E)|%Hr-RA{V&L|21;0Gwi3xx7`SLbg z<96&Ar8#s<#atixn47hY68$^I;1b`M?zX7_z18CaNFD5jn zfYmUR@~E@P+Ub!HE@VpQlF^~|`+#K9CE%aIIPz2F2mtE9>0Q94iQF!T5@o~a-pQA} z;LDA$Hvq^rGFsn^Nfc{Xv5rqWn~*tN%!!z8FT$D;?t4y@GGGx_rkqHO(QA2J#WEF- zLUdiedSW=?_M;>9o`X32Me>{ewIFU@OFlcN{AJyMgJ+j}85~)Tz4t>m>a#8(!wNke zRk;nLTC=6iuL5ij*e`@H*zxcG`d9d8|KiW^&;QlG!oU9W|A4=K`GzY2j~_mOXv2*G zY}6vvQ9Yc{nzPH+jv`=C=Wc0n2>bO-G8gTHEZjmrwIU6$BcRXu?h)+inhoCS+ndW^ zIPGinVGqn~gUCjpC^RFbxTvCClDEB*g7ftDkG%ms)P0qE%D#~*(mpHXnx85iDB_8l7vZZFqLqph^V911jb zZirD~Ky{;;pC8`XdE0Z^ZFN}2%C!3VAFm+in^kgecZwGm)H?P6W(s>@qDP={LeIYj z{N0;gjr9bjC&qmS0FOA#oaJxD2@a_H`>Nr#;pLg}2*xiTA5i-2o&Z4TvaiS}a`Q&y zNsI%i+fCRdypy(zd>JQX$vag$06b#a)6c94wz#SQsw1IF&O-nwZqFuZt!Jd~9bn+f z1wUTV0ATe*RG?`@iS;1SSwS}efXNc(;rx1c0C>Wbn}B?Ev^3MyS*e=I9lSbG=OGOe z3vV4(#t2>8#?*yAm>UO_J{tcc@9SK2N9bUfu6u@vvpECgp3V_eig!vbY)}B`MXU^V z1vR=IgP5upYD^P&j?FMkAH<-H@R^+6QX4S&D zum*ANURw;(E%5bw8mMOR!FOOnuEvYoJB~C#K4W+oEfW=Oee1r zc?+aIlXuoaCp{+~63c~aa(Wrd9Ar1u`+o^-zX~%z8(v-*A4|dKhpl=5P5e!vd9_zb z=ND!GQ1w~MH}e)o=& zWcHO|jMP#z7FYy;bD!bZI?t&iNTX$`4J4Xi$wPaCjd&!ebDG_g@<K3!z^51p;wtn5Tva!M4?Tv=ux9`1McU@Mr(_-{7DAum1vn z_UHc&fA!OkcrE~MTPv(IF>+AY1oqp1dia)peW`e_AZnvd-hIDSk7omqL~?sk+YGr^QM+BE zT!Duh@Etb%(J%iN{;NO!2lyv{|4;EJzxYFZ-X3w`8_M+ty6vEy>ZwH3zVCd)PJ6%W zxk&J7H|Ac$C=VF`b0SXVF^{k0*L!#X75G`~lfeV6^F5zgdGnqR{=sDWXZoKq@tD;p zbHf!Ly=1QBv@4lk;GQSJ6UXV9O#iLX`%`uYoZanpXU$ldBwS>a&0&CD9h9Dwf;5KtVdWliWml(!g|3IH=Yotj6H zjp-nb`K<{>8G_GKV8x8MkVwm8UTQ7{65ph#XE1ZATpl4pLj~s zh@s!~%z#Gn(5eg?+qf!gQuNIJ?p~dqZn*Da(LSv;jc!6OT;Q?Q9xKp}xllRB+>4J3O-MeoWHl*5!9&oJfG>eMeyeUvJoM zj3*F2mJ9yqm%qe6`ICQyfB1)g5C5m{ejmU0_zQgC3(9`Q1MlG5wGP$Z+RwUQvMyQG zHg)e~SMZ{MM6D`EaSu;KW{civ9MMV?PWbod@(f09rpfQCT<_6}dqGkvd*~p2ROpI3 zk`wZ|QQIZXAj5-fkGu~ry;jd1T5_4!@}_H4Krgf`Ma#(c_V@P|W!adA?H}_6FE2a3 zf4txWF*fY2Jaf;7Ggi49o$fb~883$3`>QKCeP18~;J=6NVbZ05(26-SWmtX!PTU22 zIK$6*Ifgt20P1PKm`V?UhzC&iJdFUb3cVYEFE_$7Q(bNm)sRHt*OtG+hILt}1CkW{ z0Z7(RgAeT9XO?qO+MR&zt&fha5C<^Fu+sKM@ECm<768hJTrs@1#j{_J)Ies_&n#Ep z_faq!-iBYwBlF%DM}}yX5q07l+5_OdF1yyl6*`Bw?GF@BmfR=II|Ec&FyJb{Zm3|8 zOFe0PE5KhrKjVMl;}m@56s zwHlE5cDtcQVrD$>h9}za`SOIn{r&IbkN)8A;P3sx-^L&R{vYBGKYfp1ULNpa2Ob!B zz>aclZQtdt;}+z;wRvyIRDkJz(^J9>Zn67{iI2Cd2UY&x#%_MN>K?P@t+Fet-=mzo z%(Z9dZ7m4_*u%Rc-;&lo5%6i+v$VM{pNo^&wZ3oDYxj3L74nKA2B$#m5s#@UEg>88 z(HY>I*#IBuoF{C+e!=Z!$M;VcJkkzo0FYWJ7&3G;J3>+bsI91V$f|;ppH$wwl5Uj! zh!eb#kW5bj&uBV4apY$zd)0;(+vflPdJkX&fHlrU0Dyw9ckD#?dLumV0Ln!fy@!2R zb?%JEhy%}&>$bG#s0cyk9T%M$Ku7;qh~I7vzW+0WqPx&z$y>n>XbSUIi$4)NSiA4= z%y#=_cIV7KUC)BKYV)#B%)_XXv+>Vc7kRyVfLe*&Q`G^Gg$xR=I!FYg!Ls(QE%~;X zl{?j~7uYs13cl=D{OZe(_>15CC;a)Z{}O-xSAT*3^w+<^U;X-5_;$PEhv#p2DTMu@ zV82vjudei#c4(x5tg`jcD7yr`wmOcgr&1%{sBEYnz$SGHw|hfnIR}ud=_KwUF}J7> zEf6#6>cs7~gJ{S8as%x*Y)rT?;eiMbmkT~TKHzWt@|XDIKm5D+d%yTY{QW=tJNUzo zzr^>K4|t#p3fCBoWxs*=Rs)cMaVa${%f46OSAiXO@M=$1@3&hEpCe0C92jR7+=Uk> z>toueFirUj(Vl69C4VnlGOObl7_MO4*?NOC%9U@Lm)C>{)3wJ!owdT=h;s*RX(|_0 zX50$^V`>4J>aFC%{4qs8*+0P^XIf}Yz$~Xb5iRJW%eex=2HGF6zc9Z4P;lWZ3hfa2 zR*GV5U#HpVGS8q-PoOJ|QUp zNLU92fQ>{65AAH?gc$%>7lQhB<_-Xv2rpdl?aE-fpdPbphd~Ns#;9|8@KWDs6%JAS%8<1c>mTm0p3e}n(W5$9%eSxi>FYPV+-~^t z?FF~nt!~^X_2li|;`pImVFp6?BGxc0wcYh@V*ych-yXo=+YJO@+Y0!`Z97TrdjX>` z*FATo?z+2d8!p=eo*p0Z%TFKi%a5P&``>?$Up#!o?|uFS{^0X3@Qd$0)lnuu(m!vCp=xA@afY>JZz8n^zj2e zJ$=L@J>bLkfJYQOl!9hjqA+9M>;1a>?FyhC3@KYZNF%2PiwZiu&7;%CdsF(H4P(Wn z(Vn|+){IC{?yt7$-Ub5m@@71r!HSs=@0@etY|0Ui4KOt@_ixWl<@(q_iC>Jx9!m)BtL0dVgmpPU@j>9fa^11 z1LOOT1slJZvk4ny4xdGroiN2#|> zP9Tp3-H?}ZFdV#?^wBk~o}{x+=V#mE%!)gdIw8S;o+};qUZLguJAo{neQjL%uP!cj z{2sX7-ELuEnu0WB5FnAZMyymR)eIULh8@f|349#flEP6tiD$h9eeSoBv>h~rzO93s zlw{OX$Ge1ax?KUTu>{KwT-tK&$MOjN@QCg6FZAZ1Qco7|rLG7t6tLcQ2J>D$gj|=R zB_?6B{n~YCFtG(|M=#q}7qYp=(NlfVz$_SrQI~A@9UB;Yt6lEkGW?nFC#lmo5fWW+hZ&w-;c7OzeDdaA9ec09%Vvy{LyoG7u1XP zaq{W->A?p=gR+t-$$dsh(fZZO;Swxmmplk|8VaMKxQvJ-V8h0_%LGRcqGw-n|K86m z^JGU(m>e~ja@|k3H-Kb=wePnbyX-TPtsiotpWC%`t;CDzOvgy}gfj?!;?(PM;y;^2>d@a(hT?(ZFU(Tepcn6L<2( zI*@Q`^4|FzfwD9CryX$IaMv@LbWxx1B2QfQNAiCFJGF8O{2KvJIOvP@_ogOmMsgq>#MNlogp7>hU7j@<8N zs}NZV8__#}moD%XB-JaZta{&#{{om&JamDEq=_F*x?ntigG$a^aZ_VyHidMwb5=SD zgW{&Vv0FJ!qI6@$fsPI#Lxv}Ok|xd!k9c_}eE4<^r_huq(&2o#*_>>)&{TcQ8a28P zEI%3hB?;c404%9*5X8hrxfw6Ii-X5zP!&M+J$~}p#u(^M4nHB}|2mg+nSUoh;&bW_ z8UjiMdNn)^^y(!LNKVNbnZu@pen(Raat-kawt&f9eePly*4EV!Q+w@S3{2maUvIou zFQ%m~=@?mDEZ}o*dy^rt$0{Ophgo{u!p@sU0g;&|2``O`_OzwBcouGhQ_tX+2=C;R z*^$bV{Ku0nyim^W-%ZG&XzSDZV4XZc8#OLXVBRoOlPYh(d;D5a-LfXmRxxfx?U z&7EFWz1u^iD}1nG&eQW_Ofv#N=WsG$Z0f>^1ha{iT6Rb@EQJ=ZTrTyMn1)y(L45$# z>Tkf11+yFp&Uv-7anKWz7SA-LBHoaQ(of6gd?ZKeL_o~*(yS&4ChkZbJ6q(hRrpr< zW;vr02!hT5X8FMa7t0av;ohL(|CWo6#M63SNeMKh=b@CqRE|U{Q61#vFbt-w9Q@_b zv}rJ?j~RE(gomf``^}a4_qRRXJc$-Jg224D)Vc29X`Z>ah-anD-AmBfmdMeeCH9my zh5SB8;(qWoWy(wh|2?MzVi`&AhOp@e=*{c+42rL6oa?8NQXVRgO=>rRaNVbSDebIp z3xU<;_-cHe((o8ZaL26YH9z~Z?jygKaWj8W?j>@+UEIqfheZYgPZ*mPcnoksupmz? zv25;`U);Wf21=N@%G3gl(%mifGxRm1D?q0k<~%Ai>xBqtLKK4x6dlU78IjG~={Oms zIvotF!H*FA92Rw`#&IXj!m3NEa^Ts3=}vDrJ1n;~lGetSry(TF(b^3RT0pZV0YLXfru^j5e5tjzB)iP!ID#`?Z-oSNZK;L=&9b~ z!Is~wK~fvr3@<}zLJR%kRdU^{$Tc>h?NkUz&n-t?QD}7A?ft^1kEEUxa~V0h*0Cj z^P<=zonUCpV;^Ky%wMrOA@|@>3WPCYf>%=vNqM2J%TRe%AWhPwG|8rric=xb*hXz- zehw_}DKR7S4wW7*hEXmu2gJXTTiGMUjD5pA{HiVU04*R7ht^kJQgFFq#MNtZ$}}ID zpzKn_L}NzVUK0k0!t#YuHdttV;Ato}P`ZPH<-_xzEo6zp($BNus&LH2&ujf3lzd)~ zt_t|IDKH96%R0QMLHiCJO9t%8U1w=zT4k6F?A{T@(X}9wnxGzg(tB^~mn)bUdXq;s z>)Q{d6lHBjjRJrM4CTbFNzg$ki}%jNCG9{CfZPz!yr(){WGQTi9mCoMM!#ajHj?~k z4|M2vj%sOkxxG{Sblj=eJaaHUcP(UjM)f|<1)3K>Jg=RNxw&Usa#zWL1oOj&XU9k+ zwDRdX?TH%rxKBqCZ|zVx?wWIyz3HJ-udU{Zv{WOR02J)EE9lZz0QxGT*J*uq!^obb zvI$Lscd)lJF{)?K$)>ScXLu|EKAPt*16>=c>_}BMhi9EM^{I_b$$MS8kqy~o{`qJ0 z-T30nQq151so-bFj_qLs@9h%$t;O=O8#pKkf+e!z^keoYfRi@DAd;XI1K6{`IC@du z<8cfa-3Di*gdC%XX`AC=?i0`cs+;g>7+IQB(UPJcatD0K!uKmldGx7nqzvq57 z9&(=k{ctLTFw%}Xf7Gc|ji!#ogy%Z% zwRW_h3d`k7jP#rdYukN)dpv&qkD+z*uKC-Xqqfo`L7z3AS4~q|FlLSW#mzGsVJEwG zNgOaTjqmpm%eNr&^(1!mK(LZDj`Drwt&j8C7A^6* zoQXBu3v`)WWE0T99y7MSH`rh(D}+c}HsX-j5<8#uK5^}(EhS+ZONh*SVAIUVLkI88 z_e+Kxtz~=oI3_dXVfC(PIoY-MP!O27Jg9rLjL0x?vn(tSoXyNA8=(}!b>Fe?9qO8j zX_zdLO13!;v>#eMSpqis4Rgu&rNMZr(w>FsA#ggMPz2P1yG zzp3HJ<$huU#=`*Ny)8P5=Af%`&R7cjFK(6+o%Z%18PPHuwTTD82sdj1bf=q1=D5@_ zd-QN+^yl!7(tln^%G@J!u&jIDPy;G=Z(N@kXr4qViT#L>p)U_p&$rIsA=m*WdOJ)# zZFxwHS3BZ%VEwr%EycdNLW}~C|f8OVwR@nJWIGo@2*t~bO*J})2 zO+t{j^RCgn$iq70yUtHs4Yc7NUxIqHyB8v%Rs4R!0}$u$8S3RPC@G1jc{7-FzkagS zCG_p@JYJ~HtubZwO`g@HHtg>npKRz~K|CreWi8Icnu?{*8zaQBb zvFw)S647Dmq02@nGXz6|<=h~TtE4g-+7LW74l((j>fypFFdw#pm)i~3eMh0KS?`m^ zB)`}jDL8uRCJ*=hO?JXsmzjaa6VrG2c?me<`y}z5Gc7YDC{5vkUlvhMM=E+0{h^t) zI*c <31boEJ4wT`a>G1m1P$zMMjt$4AUtws1u#6+`#3JO=!-@gDW0;%_<*w{xH$ zeam^0&l*I7g?v1|Y5ZIn2knyKEoCx}1y~7f-L!I2c`|<}9XT@p&-=0JrRM%!d-i^w z=hZj!2C@0N0%BXNN#{qZCP)O)s`)GBwiLR7XM|a&bq(H*J9~cieNJqVXM@sL)C>*K ze`4-VD6ul4*J>_+JThX%h~VZP0?`KEf!l4zg{TFGwIb1;dT)AHPao&hwn9AT>v4yNC^r^MK_*8Z^%>e3{X@=kGZRdl|2$X* zXLKu1%E+?y(~^20b36>A;7@35Xp)rg(!h>O93$@|Ssp^G!ST|6t1EeDBKJf*q2DuN+NMTXO7jY$zLD=NXAatL zJL9so<==?M13fu=DeW*DduMVqE1Y~m$Ap`GKa+QozTl2$#>NyrI3qe~pj8ac!#Hze zuIU(hsh*KSjB=@(z#hcoIGP?qs#m%JqBir`@!O|xT**ULICrR*x9HLit|Ch*; zR$8sR$!{WOdH{3mvR?T(p*5ocKt7xka}2+hCZXZxZ#F-9o*V>b!oJtgN)H#g0Ypc@ zOXA!!HmFK+RSY)o8Ctx`%6p?_cu9X1Z=AHBmC0uc%7G0YU9i1a;|c2?WNWDp0g%MC zY|Cj=oX9gAqq$+l>sUR2%sckIp7!abJI{k1{MJbJ6SHq?xBX#gKai*qd-_Kz?j9QN zyY1f${cQI=p67G~Rvi1Lesf~7iidhG*< z_2$&|)sb>#(!Y5ee!k;ZKi)L9i*#T6ccN#QcXAc?W5 zfTSgjgGn=vowu~7NH=9AT0gf{hCUGJ+(EoqYgs+fWchH`t;O)1hhwv69x|abaV&H(p}9RdEJ&ojC7-Zk+X%SHYN3XKsZgR_Q3=_DYq7$3h}4GA5^N(P zh?AzwJ9m;$vju}05tFoKn$VUv2f|uk&N@cqxWTl+u;(I|_i!G)V3g z)&68w2M->yXxhH^pugdXw%=JLFnTlmFS%d( zwEZXJ*~j6`RYwcDyZ((npnRNp_>`qu^=!i7{udV^+m}nz+zV?uysGn;akPd*2fw|= z$2yGPFd1whYq{)(Mt$0Ag6 zMpaK{_2SfEK}omojQv)_LltgLqK+L5PurERR*~m;Q%jE-Wu#zqPTgbHou%iIAk5UP znO_$vgHD!d-;V-2^mT=5Y4W3Uj49Nq?=sui_=4I^2GtW!D9m^$8#e5?U3U-_ltR!e zUqYwIe^jgwep8ez!3|DzI}c(n}n6{jxG z_#>r*{UtkEVv{OAc;96Fg^@92R^x=|^XHW3?Cf2f-v6X!nD}^;wJ#sAMf#pmPw)RV z2iW`|P5eP;_3zo9O4&!DIcjsWyS(%96uvudXa>OznGN`Zso(l_c~zPX9l@b|+qs0+ z2hIE)KKVQl8rbG}f9Hutuf{0QYgx20=x1Uw%fiFKkBQd3K~7|!Qhi4>qeZ$=1rGR3+EY5OP0GGo z;HOptryu33g5$Q20J8s%-5jzg%=atvG;zm_8x`EHH+R>l)UM0PnbP(XcIa9okZq}( zudb;$RtvkWa z77wI&$kPipmu-7ZJ3aXRo}1AtF!k)PLBI`^$^MPS-0*7L$|x6;uX+hf zoTyZply8h}E8qqI6$H+o&g&t9cScWY7MZ)&s(H?Av-|yoG?qoWDIsr7h#)*|ekR8c zToj`CyI>pKCi(4?Gs=n8!%Ce~IW0xkvt*?q&YDfDl-`QGXTIjXyCBCy{XF#foKUrM zEHmg)6*?hH8^pcvM0G|i6?e_#XAg>IhGP=m~N zBDA}^34{XP3vMr0T&Uo(wM!EkCU9cW*vyJ?$dDqD@c`m7aMt&fTDFsC44+IiN&XWc zP@d%};FZXol$Yb@qyV*!JuFR?U$|Xayae64WASD*{4T*4+xq@x+i)oxz`*rZL&CUp zu`_a|mASS;9R-lTpSGM-S`LP?`X-HmXz^+vf{ z5Sn^BvtXzxtGcD;vGdLsu60{6m;vE|^2vO0Q^C9+rj?+?>3rj{@tIZ8 zB_X#goMxNXBWI%Gt*7?0{-;Ha*7@@L*dp`I#|Ru}4fj+FYESzY$=82nI??QmN!Rtw zY-?AhZ^)E3hdpD|J8&T~tcg~~;@(z|v-8a!DWl|4|AG5~l)u>i5)=F1*mySw`@srz zg3cQ^uccO7PAByqA++_hcF;@6U?cU)|7&clhq|h$GunL9R#M+>o}l_xg*QVd6H-qJ6>I}2>l^@CpI?I!)XI_gzzn8;XD(c$Z@vv=mAK-1r&U?Rl&ih~( z67xt(o)RIsN3bGmsOZHD=eE%TLH zv?*p<#YE{k4y6_FGJmgyD0e zXyw)LkM*B#6=PJS9=f^=cFb7l1+!}4Gc1?iC4lvUoyKuEq7)_ReqPA8eq!f1Wo$LE z43Nt0urcEiDPGa$jD>Y(99M0t_ahPJ`#GEL7e*k><=?#4HZrqK*_`8o(C?JYt%jpOE&z7#+jpLsq^ir-8lxv&0F!?I>HlkMw$D zTz3W)*l>TnQ~`m}iW^!&$=k5!DPH{1m0dzF2hJd3g$QG&Qw;a&C*vRH$-7w@Ve;5LQkgO2scR&ST+=jhr^r6YzT>s?`EJVM zyM{eaI&*oAA+O{2pXcGpXG`?PLy>5)qp`zhEQgsV<7B4~BTfc6VT}myFqqNgp#3(_ z;d~O~CDx)baqHKK=g1U)1{=(N(_-rKXB0G}cwx^9cXH;84d(6;LOQavntq-~?V+{; z0&}V1Ul@3NcmVdj^&f5M8m*1-T` zv+s20O&~VE_2kTaE&!51ZNDokdG*ZHWAqSGXo&Sd>CZI)H0?V+JU(Kh0x+AF`O6DKKFFUp$ta2L5%uoIDf9{69`8N% zzmQ44@NOTFamKYCyxMkoI+0H|rM{)>k;yhUI$jR|d>icbX}=RM6HR_PVE0)$&bfZj zes*c+HHC!$^I1;w#lq}vpy+W3MNHc`$`P8p{oR1Sd79qKqlsnRy0fZgRYsvRb%^Fh z=Cn-PHoJ;46CNS!`DYIPj%K_&d73HCgm!0VZfEJ>h?o^39>3~8p#&iMmY;btyt0PL zbMQASKey|Ib2so_@a@|R%2u##_Vy3$Bbomctr?*pGDuE9PYCLMHlT3Thm=s6x_FCH zNL<`g02r->3=mksskeB(sPJ^03g@(rlD0XPY!uWf?*O1yDax9eso6 zN*)R3b#<A zi z0rOdH3mBVvo|CRv4QPp-DYUzgE~kIzPC2gs!bbF|!$PuvCaGg*=B+%MJ3PyHo*1W} zz7N*TIcL@C93beS2&-E-=hw5(jB<0yZ8a3RnInC2+e664U*zt^A=*ILz#v?&&-m`+ zBfu~1{@>Do9CiA*8OkuxJFKeL@@=Dx-RR1QeLkG2Ry@qSgZVU_56?ufyvhSO)Xmu& zGq?n|1htw*REj^HYX+9%QCS-6ssma&k{6+0Hh^!>cqoMD=PPbI0o1zRu8f1NQnrKAJS+cI3c4J)R5jPBZz@km_=piZ z03Xf68SuAl(fhn9=(6O>E@LFI6}WW&Y{^yreEz)NCwq@lK1FQIjqwPE-%vH3NbKFd zxlOysI|E%J2K&(Rs)jQv{MZnk@;)EsJWDn|_bd(MwKbZZQ5$eg|2zZ)d_9-W`l6JB z&ePuDpno~fsZ*Rgwf24d9E;OG-T%9PEZ^8wR+0$F=x@bd($W=xC&xRP*7 z6EdWklyw{jYb?h0x&F~X&G;>$)S`i$rkd1z^4%y*bLeQ>bVQ9aN!1iNH{)Y1-m2lg zJduqD+oTh=@k|x-XI}Wsn6&i|-4`}){Cvn=BkrFjm~IO1duMX8ZPX`jb>X6*O_hQHe9W&;4iv~y?3v_li{;4;AqYz@oOs( zEC6kI{&vN~b^&+?)86%$U6=gtpURbu>XCNf#@8Ij|gNs#J_h{XyM4+HPyT50+gme?b82 zSkI}prmY)L*I-&Q>)G2C-uApdv^*u^WV~nYxbT~by)#xX5V&wCo5vrvHxz@ z8wfi-K0TlSD01sZQ1}@nbc^AKDw#9o+)r4G!0C4SnG}F_# zPd!$d#4#dSs+~N{Jzm+suSwfR&xmeht&^Vs-mwwzST=05;reoG4L6pz@wlib(@X?j zgxoOgRN<0eQ5FexXnCHgFs5fawSNYs!Y6+le$FTETfH7xspo9z705e+j!Bqc8t2PV zE7SyPf;WPeg#eAVLG1tdkKK3Qx~MSnksCl**KAGsS)QH^%#_6X!w@%Az@Avvo&CpC zz9X2{4}Qd>>NN_0TnT|n{?pI}&VF=-_O`6&$ItPMZ5ElOA-PnMjnFE<^Rx2n$OGcA zp346-Fl6xTA9+qjr%_u9p3EW+-=jer91^2`y6X;-SbO@u|CXZO_99**IVH%?``qVa z#xQ=CBf&MUV_|Y!+T$z`fwt=X`}Xx4o-P+W5J2tl2ipb_H2jNehXI3-HEk3V@9m zpPoM8+fUE+G`OhW78H5zry(0d`L01xhMBs~vI0U)LYq{F1Ud2S8ypw>Gzm)(AtT&cz~d<^SGSPF+)YckPNbA z@J`LbK~Yk4UdWt3UTq1UF|{y^QRQuuH<4i{nbwqVuGd`9AoKP{xP6Wz=513K#9R`; z_Bl69qepb!0*?XIW9of#Y&_}}e+U?CVP8ltpxC5^%ucrtTO5W)-IP!&( zEeb%}04kHZ?c}bpe0C5B5454|!1e15<>Q7L9fsXu6+J-~sGJH2^Ak^GUxqWtWt;3d zs+pLQy*G#GIt<3)GXl5lTWitK0OJF?6U# zXn#|-n~%QHhhp+h(83dX=e)bFVE*PvGw9#J3po{9e0N`mh9=%OqwUxE2YxyU{8HI! zqLU86YB^0mrRAYlXyn_>Gf3`@aANL~SbqU9Z7i_` z?PModwQsWJhIzxw%L^X14UZ26#4nNngwi5}ke3a%XO0gRGe3Dfx;6lJ9D6kaKeuDn zlwVwHvmPXQJ4+1)x1KjV<9#7l$OsI({4ou7smY}@n>mx(nL(uhR6T%&c04^k;N|%l z*c(bWu5z{f*Xo*mqs~3iuYW|Vh&vB7zbkqI{_?tL@jX*Z@xAwMyiUk0+yZ3Hi=$F9 z#rZxn%MahIzhfKEZ3T_~E&JOn^{j38^awc174FB(QjOlUZ24hf42>_6U$fVaWFnl6 zkY?EJf=DC&GarxR5p7}{53KoPQ|8q!v4ecx6YQ%za^EHWw0%8evs-~iYa&J2*S&U> z2tHeO{5w>W(0Ask#6&tJO;^Pq3Nzuc=Dum$lo|Mw_cUf&`m=s+bdfx5xmIhZq#5cq z8bL8RZ?qQzCYW=Dbtq*+DHl9HU-A6>f{!1caM>i%$BrVmKt#%#i_+cbIQ^R_U!!9? zxD82^Z;mF$&-?_oIB^%SUj*?+lCrt=hVU@k{J&Z3y_rm}?pKvdZeaT0c#YDWz&-Yu zcn53S>S^E)4;Sn&J8oA1w*u_adgHq}5ZuF1vgvC$B0fmUGj3j%X3VV(H?UGHi{~?M z?>X;WrUc@iH%|o%1A#NFJ{N=$_K-V9m1|d8*8H}KH_~qH%}hi|!Y^=RW_c!~%4zWN zPS0RJaQ1m($rxs^^F3wz4iXm=f^Cuc^rMw93=P769RLW0VIl|P|>LZ|;Ia>&xshvJcz?!?RX<;gzn2gCn zpfUISQe+Mgc`R=L-^p*LlM&Rs?m3&89bTAGaGXMU9AJ0FEEr7nM6Yh+s1Oib0N(I& zy`mJLUi|R_V6Q`O0$sapAcP*|xk95>o^4U|_+-8&0Cp*lyR)hS;Rp_YC(mRKcmUW& z!Z8RZJ{R)pELXbO#b1;*q1YUkyl&Sh-gvF znL{J9#f-7V6F-CbO~%;n>$334NBmnoz7=QP5yy|VYqU>SRJ8M8)_&P~5bv_-UMl3f zcitky=TP61`b;*f9wLiE9EoR%$DbZf!r@Ds(65 z``9IG+NEA3n0|Tw^WML1DZ(y|Sy0n;+QgbjZG`YsCNu2J=>M1Tqsfe!Y2VluGt6-% zN=sfSx>%JR=*EB^Xtn*Q%l;odqY0gcL5gEd($QF}o!39FD~fw#69qX%LJIKoTyK`l z#QJ44-M#^Q!PlQ&aM=nzJZ%79n^VY^=E0rAD~b(WM_BflWnBSW!~kNuW^n9G`kg+e z{eBPN%mB{7O)trtK&L$iJQS8x9frz!0J`-a8`}h%nfRk?znKcR8!j8+>B9rQeEo`j zZ*X$h2Z(;kd361o(_Yo(;mv)Y)P$`#J4QStp01LmRJ-V!(+gZv? z;LiH&i76!){c+O9XbchO?Twus)sh0KsV|xVlD$qgRLzW>2YB|bL70-yKsvU4@LluV zXk~eun;kTX*+YH>!Qm6?fXu~Nob)wP(*jWIG~l$d_Q`k!y9fqyfG0-qN`~@c;G|z{ zXvqnm8W2u-UZg7N|WrHwVfniJGJTieb zo+`VMIm}VOD0q3f;d;B`!{Z|^w4;E*ePyrovbxLgfYuRy>n$LYY_i{xwWhJ8zZs7% z0oxuq6V^{6D-UenXQzKhz_e&hbQf8Bo>YLvJt-2|N1~mRFcs=xq3F6hx8To(+F@}5 zK7ITM2IKj51ye!kg3j4o{cqNZVQME<=+Mu_BjRvSI8m6cCZ_?xQKqfHU!Sb+1SG7- z!3)1(zz=CM`VMU^tCCg&vZ_(@MoTgB`?Lg(alkz@GdKgWSwq0fWoh#I4PJbIJP zn{Sk+A8=iKWATe^^gsiXe%6l#b1-JpDD=DQi(qa1Jo1{YOtp9{%quGpXbF4jS5&IOBybj@DyRS&;imQMzM| zSq&lMsCW(d^Ja;GQwIgG6)SGSFEU16zDq<~gX}0nkldWVvm9x~sP(p0l}-R{*muIW zZ{P6ru;Ihw2EJY^1xq~@0Ip$Tr0fb6l29-PR1ba?GV2{v<1>>7uTiKolzHbfVZ5*h zki3vcCuK$!Z|Tfsfnnw7{tfOD2dF64DZ~%Ug(P7g*v58lSH1}d)ROC#z#ASez^6}7 z`02A|Kp<8y{W$4{^l2Zmy&ONkCj>66tNjQ>-Ps{nXrBOtnn)niVM2}T|eF6hnB4ST9jiE!J2m**RHYLy1|N?o(gF&$o&SQ9gmlS{dU9GFW(>| zXg7<>l83)?=fGHuldfeDh-sY}<3!HxNz^jCprsQ`!N6)y+z8J&eH-5-ojh(xugOCC z7;u-T`SR+cw6aSx(Wfv~K|>wU8)QAf7UL}Og$To)`_dCLFKe1nxGrgp%6#-hzShz_ z3iF+pJBV$EBY3D`R+c&+C@+7o$%45=2~}nDq>Uq(s!czNjOckm>d6{PnmA~49?4b1 zS(tqMjGjsRWgL&u1K4?-{D&?-fxaZB%W+z_+y9uhZ8TwzB~`e?IuSu@Cqy>>Nm-fa zV^%N)ag*Sv2ngqr)yv6IKKmZIxzVeN;|n7z7n~Ih(0eS=&~|NK>qYKh4rS!VVlmRT za%$;@;YJ0e1%CeW{DP;aCtNlH@7KCfq&bR8y$e=(l+g_wJ9fg;zWwONPEIJJ4Vt_m z*J9xO>5tGmctyF#tlOm83cC2lf?`Ln%*mRkuSy+m_O&JK*>;1 zB0*KBt!s-ihE0jS?|TpQUH}v@Z@69=x7&{IK7Rz^2JBpK2%(~0$6gH?-pTeG#y;5Q zW&E5-5OX-EOPNzL^t=R^y_=Xfk=k(&U>LK`)$-fiN;z(hUfH4yQJKPe=MFn$#;Kp` zBLj*8NR+_P{Zvj9V6;&?PRUlA(6PZ>#HABi| zs9A53aON^4Rc3@a_2{|B)T@BFh8g9L)hBg|j-oGXo-wA9`i5+z*;Mgm3eJC5?i{sd z|35Q;jz%Ef4_TU3ZV4c=f1sfiYx~#VQuLN-=#}{KES%2|`}vGAr-Ua&Av&|A{jEHw zF#s*tZfQub;B=rc-VQLROzth3!L%tq0_mLYuLhu%OOil^6Qee16(ZlFoVH0 z<;-llRue0^o*UeEtr9{_Ef1<=YJp4+Po(Zd_Eol*N(7cP1Bp31NHNDpSx<6!&+@ z=!w=l?fn}cKJnerH=*sMVUzE%#54KNycyF>?_GAOPFiuP*H(JNgGa?q9X*}Mor33{ zGhWYmPWx?DQU=0%D>-=qxRum3z)TA7F^x=4Mq*e_OH6;DX}+0}Ht+vIkEZV|Ks>VB zj!QhMDeFmI=8T#=q!$Cqjt>LQcxgL^!tG50@$$pZqd(}lk5HpH>yW7@9m9nE?5xkJ zWlQ4ZXPrs;Wt19;V1$>NKJ)Ko=J0&R+7xUEph(46K!IofI-pj30l*DUPY?LL&)?(AmoL~sy7bY6;*PeLi>MkOS%5Z2 zf!W{McVTMB+bQJ?1sPrwFCL|jSo4$jNv$&_F_sYjWrO1VANM@>fj?8|xhpaetxGD)$9iC{I?fsBTI4$xtC}D=ogSjnY|3tiA)Mp4(O* z8cUn1sX5V4JlPf}HgAH~KDB8+Z;Zxhu3=q>3qTw8>xM61zTx}NpYd{ghMn*X+22>` zQeqrG;daBy66Pq~lN$JJ9v7FKJj_gnv(IeCTei=**QTANFH6oOKrb+!wg0Rg?FGV+ zgEKop2eQZBfnT!fpL;AIInhJC`F$0;S+j-E{cp5wMKR*n@x!fy&a{=R9W_Qrz#okfKxd2 zNov4|@9c;sxvzcxmWD6r`X%=}W}&ec=qK}gh`sMTrAOm+^lMC!DdIeB#Wsez;>~K= zPGP&dt(VcnR7!IA9*Yxeanv6lb^l z7=5n0asrG~P+?$;KRhxg(!!#B<+GBlv-A^xw)@V=_5d>Haz!@lr9wD95u(vNi&&ln z^>nnE-2t5Gm6l9tt!~pXdxo+bmaRvy&uwNf*HgjYefo$mKmMozBteD=W(q1Az&ian z?RcOi10K;`2Op<%7v-uYE1PWo=0)t9bb{mNYNY+fcXCw% z0v&IgFWF3pZCeTDL9U!{tV}ZxW>vFwd+-4F2mu02h{dfsXZjYnv9gmT&z1bIUZRexP z4jUiMN((ily;f>i{_pykr9T9_oRD!0G%DbXk$CpNtpb@=k&vtIx`>S$lfW6#Jd*60jK<&+}4+ zol+5yEKT}(S9q0cB=3wtrjx8&u0a_wcQ0N)Kq8w!nX%uVak&7Ojqv5CAF=PyQ%8k> zeP2$d`CYnR+r|5C<&AEzo`CIT=$G6>GkbURtRer@#}m?@SJrP4mOovhEbx^RalV^gog(UbYNP58$o-HFxM(0oj}Y6nRqO9ES1ht1~@b;EHr>z}j1X z)=F7WXH1iX_8EA~KBJ#-_N?~VzGg<-eSw)KT;CNw8sRGvp5;tWDO>Ld-&clo9NO;a zaW+Wi1!PbGZdV530=^M``0Y>lgWvlFw(^3l7(GtKlrI>-N~`V)G>ytBC5J&7+3QTG zgr1*KYIpMc*vOEb7VnM9zQmW))(sLneqT8q5#DF7n($y-iU^`WS2lTC{dFte?u%^( z60vTi4EQH<>8w3`e-AfVE8)v<-PImCuDtH8AF zewzOr{y#qXd+1OvqFg1ztt(^G1E^@iT8SfGq}d!>&5oIDUXnH`#Zw`_U5eb$4y_3DaTF=k zSMfAGcg0;w!HxpH5`O&ckNEug1GepkeSgNb5q7?zl+9r~pvf6?#cSz{pA_s3d(E5i z0`?a9(dqvu@qXHLJo?YhOx=)XfIW**?Nzb=9%(LpEN3R!xyM4RI}2)A?+JO)*>}0ymHH2*Tf>D)iypq?@uA?mPoMDPPharzvSV-caH}x)Se}_=?AkY` z;rVhcN$-8;xVQdT?fe{y>DY(%D!0m;+QaFuUKvH2aFX8tb^mBI`ubZJCL%BQh<768 zqW{7hH$3g}2se{W+7LmXv}d^AtSPwel$-cLW~@B17u8~qihS{$@CY7BrF8UjmN-$0 zd_Fg}$4}}v8U9V9AUe4)?^NE+h3k}Hw#9@a7X6E#^Ml`V<}O;${>ZED)2`@0dnc~U zl}x9k44H*v)M_TA8wvmPMpNie@p`N-@6OeKbCnl#gHhBa;OC)aEMQ?Ulx4GsM?G8bS6 zXs?$@fA{GF9=AvQ^{;-5BJY})hq|?58=eb{Ow>9UM`w714Y>{db$Njc5$H08sH2%JakfK=<`e#~N3z)PUuGyp>To)n%)hC|Ro++L z&P*~}U+ArI?AbG3OEck+U|H_mo4Jzsei%In_R*S*XT`{Z<(V}O9~^V}SbhE`WznKhVt5`KMPP;_KBt}VZLZf6Rcf$A$ zHl;nOQ-xA%Z)@76x%QUn1CnrSa zi_6mdEKjF7!EWT!fZBfKqYXVEzR-iCILFo=-8p*YY>m;9pA|GFS$BN)%e=riC(>uY zQhITL_&di8qn7uu%LoHTl5X@Qnt-)~Dv);c0|&16!5bB55!HSw2duS58dz&}lkhkq zn$psZ%;68$GKK=beaC*=u>sgh^#=03;kSSN1HS+6GYZ{6xB)GGa54XvE8hC{hQTkS z^ToD+08o(=@2!l$IY;cGP5_!GI{nc2%{UlmMNaPQ2sALKfCo7+Xo?JB%zP3@-M|0> zogTIFfyOd)*plmS0L0U4eLn#ClWXo&P@8OhDlwxJfcc6-JAUt%-{Z@VU-0$o3o34| zUbmamQELX_*^4kqd|9KQ;U>Y4_-Sql=kzsG0I%a#8m2osMKjCzsP)HmJ>N2EUA`bR z@}~kr*Mx2d5p>;MUs+b@-=l#w?eD$DLuyOC1MSwFqu!lkYD2)EsEroK$Orz=Ld&pQ>vqFEq9!6A8KFD)7pv z7y~IRfv_IAv%JM8e)Fw6lBua$l|1v8;}v^kcRJ3ZjgBxgQe&W0cXo0M>tik2HIL8Z zq>}HROHa7*jvYI0xV1Ed+m*q%;I}{ggpVIS;KS1f>{o0e&zai64{`bgjl+IqC=$WC zuq~*dxa2*5v`A&tnHGQTBfhxk#<1Um2{D)z))u?if(I_Jf8|B|o(!+=a;~DLM6_P5 ztcvzqA){ovg~TdTEQn+~m)HS9pxz=9?L$dhh_LfBo}ND7^XKpI_3KxlFrGd=g31PF zJ$OPChsD#vZVsiU0PWR18A@gZri$rO0e+6&qha}WHl;g$z3(qv z{$M*mlXoeN&eO%7nuG1f@9-I=s4D#Nc#&2A3lK(%!|S^`W~cqpaXhWJWGeRUxN=@} z)S8qho3+f(f!2`T9^)N7Ds39%f8CNJ9_u`neD_B=#$yNUC5)MMVS|K3+jqi`Km3H-jq%H0egxqee7jZr|KXv1~c38`VlJ~Y`PQK0BGjC%) ztkS!)Gs9Z0XX@d}FZr|sYy#yDG)CC3LVRWhz5tYo~j>xfTd9uH%4{iN@=OQ|yUwu89f z`n==i+ZEq^`~b!?%C=+MOm123C37O(T>(oraVm!F_#(U?<+yKojH`Y(@ViI8Wd5Qs zm{rESM1e8P4h|(wTRyWVX!1HbE8C}jBM7-A+GTZZ*13cCj2_-)tk)M)Yuo|s zdZ%#n%#{{2x?smvZut20fUOk#_`{F*_Vo(FhEle6^2m23zhFDe}2fzSHu(rt`lY`zLtu`<&4SZX};?+}*@u>8`O#ZDo6{dk%P=A-S5LzV0L1lKntNLfU}2v+4-rvP*ww8GF$N@lMTlnja{*88udT;~Y=F zmx-T2ljiB`p1CMRwDlZ|ioYEo-Z5Z#*1tqfC~{9*C@DE)dlh*snG&&?w?E6|4d{7& zv%arLsw2hlbj`+SXkSX7?q2A%#t5SWaTim6?L``mf0ipCr$w#?b)jF_gKCZA2kf^S z3O(TY+m0W8^9A31`hjAO}Pk02P3F*ZszTI|CrwrX0u%?H3!8t#fD~P~u!L z&Kx<2%J&NGlj%~=9xd`m10t|w4SpDKv&HiC$QG zxmJ=xJ$3oze%>6t&-|prG@K~~2Q)_1OG{4XZajJ(C#=cEgXq`G&{K2RuGpPzu+7jZQ?hEYaB`(3BOyx}A&cK2-s2pl+PXL9|{{ zL!+rPs`m$en+PUi>a~VXpwb|F5@XMLmb-X}`6fywbFG^*EY3bWIh51> zCc2MEqHt`uy#Uu20MBnVp#zfS zYxUb@TdBPFU-|~feq6i`U^Vu|QXrIa0aHDl1gaLurwL>qR_ zR}Sp;NdwiyQ(~+T*ApT$85KxckUCI5{M5Z_nI(Pfc1i1)+r#tA@G#9`y=?F<^p&$L zbSVR4_q4-L0ku>n-v10X9yj`pPxO^#wdG1AOF!P-=|!X}G4Fpc4BN`+_sn)#VGEU3 zue?x=3)o1ipMi{Nk>>8t^of{Pnwf&Y*R^Pb$A+U1t-7TCzBHRdvs~=!rul3?V!r!x zHBjev`X2cvbt|8)B=v1_8J0-tlp8tROHLY+7$W%^LDJ)pz(TkPL;5-o13t!U@AU~P z8hRu-Mz3`a=KbB##+%6JxV+8}cH=X88LFd2=s;FxFoE_BFW-P4fB1@D{_>Z2cpwnn zKt=R;9dwOFSx{)JCxNNO5R_Wmo^7cj%DBPsv(6hczq{HUavC|vjrQZKHSx0a@qISc zXV{IBGNs{WzFb@-shizOJ_G)Si7{tT3LlnCB%V3atJ;pZ&beRv$*neu63mhO^ykJz z1jgR3_z*c+N@+o(xwk`TSBSv38-N|3KRtr?9Y6f=1BeKpK7VYXV_FTy)rxRvz+NWa z6?!w+`>CUWG;A_QaAR0{qB8_!b+_>0$j!%g?k$KdUfq(J!8PU7$YL`OjrL=-)+qU$ zw}wai2Azdmq22*I3X$3N=zAc7?u7Ma)Ph*ktd<&Ps5Q`J=?@S?&$+X6YIct7)<*3A zJ-!Qu-YpT=3El>`Vh`fyy9>*|yrM;+jM)wEekN-If20>@XX(+~T9Y5eai-6FR6M-T z=0jFq%*Dy)8Sr!MaR(S_;?)blb_wkH@ZD^d40X`xmu1=Ws&0caijTZ*Lgu9oAv&75v6=CauqUo036Jb=TZR8pj|L%+b@37#QyAIqPvE z3}Z~l?gGvjf#;Quy$Ii@jI|&}7D$nY556V=PfjPY3C&_sw>mtXD`0e<6$VfM-uJf7 z-vFgBGci7Y{)p@KhTr`4Z%`gCczU|P?kC*)rd9)Jdy9A+sAT+VRZR(-wx6SAE_mPW zT=61qu0R*FB>6V8bm`!`ZBZ1$d2LE`7jdX}Nz|TE7(pMO1tPD31-WPO5Yw4N=bmXF zhI!+;l9mnOQ1Dqwc{=yQN+J6a51k}-20nQ5{&(|upHPR(h8M@yC6=D!-?u$82%pU* z8fM?v+N0m%JDz+G9Zhpr&=Gl6-q9c@oEbT=b(EYVh4ejzau+=`d!3?8w)pdCB&X~j z!Cx;dAE%Mf#t4t`07Ux73L^#no!L>q_8NTz_jG=&v;&OzW2$3V(M{LUwTGw-5q z>%7C0{2{UA(IsH}S3aNleMlFE|4x)4;sn5W<4!U>!wrArhi;sV+#A)AzP&;&f$g$E zwC+tPptk>Dzg+>o;TPY3ho`3p{Q5ur3SYl`(^Y07P!UE&*re)5(Js2g(8;MGKv;5C z+`eM@;;q0hrPblHXzSve^9D}n5p!pevZAL{X3HqTWhrwulM+z5B2N)t)`iYIpIZS!O-d-Xm3Ugx-_$sL`0bHgp9 z@P$#D_FU(9{W>Wo+gGR~ltos^S`@Fa9(9s2wumPC)_naT=-8=V(V|q*NR+(0w_Hny znIp6F*RW5K^~5hJmDi0iGzf=Jyo}UzyrVAD(gx-N;tTd$!OIKbH^2EUK7RKB-+g`r z@D0q*C`J7rqDEE9v-!=Aj|KPbesSV3f)jcsgcG|e4+LXI%n&}k@-iE|*}DvHh2~AC zdt@RCdB~mu&Jtqrn^0*mj>ySq^Yh_jv9n$J>C>EI`ZoA3GOKzIR}-u=gab;=f-qKO z?WSxb-8#Yc+Z9_OFyBxvgg^L$-@~WJNBr>X-{9rjwM8axec8F+9qXV;0BG6i&HhUt zc=o?1bOC#zcU~VH4bu93^an<$o;Ai+0Q3;gmO@*OcUV|nTV4?Isarv(L3PDRf`vXZokWp ztbCnuG)?}#vBgtwQqqevBYX;|B=o6s(aPy@C#ka=#@0K>fEeNyO!P7t=7g%3WA{P5 z2tc61x;K`gG5j(Rd+xMu%)K=7*~(i2(s`cC+uQ>?fvizL_Sk#PgIBhCdiMrgwkPb@ z3$9;*AAkD=pTGNz?>;|a=dZZ&Ge8U~;>~TRd1>r(9b4+}U5n&4p+@&%92q>Kg zOX~Nu8OA}`en(N2xzx{kRkSEt5?zxU-662pYZhXfFFMIBYyhvEB0%p zk&W^`=YcrAvb$+{)J$TfS-|&dg>bC)RzlqVorX+}AJg@svomL=24?vEGIV^c z#q0dX=jkwJI(xeI{F9gWbHL2#acip80rgx`k<&D`jq%^fK6tZ#p5_%~c<=GapM+QE zjstW6?6ugugR{B*YPQG~`tfR3vh47xW(1$T^GIcF^-6tMtTrBfUjk`pCTodK$hl~y zqZ)Ovrw1uC125|sfa4pUL1PN95ll!b+m!_17@R0EDaXzqtSt$N8-Tl%g4@mjU2wY+ zzJ0ynrysuH!{ZY^e0acCZYa26BcM=??^n7WhS|SYl`+A1_l#rHc>>*U)IlFH<@D|+ zhS~kihQ%FRz2~%amek6zBg@Es&D1wd%9Wq~FI*YV_V|K?gJ4dI(o~6ja zyS^RV$e1(a`GC_|DU`fWqoIvC=0{iF@43gv#EWn5`wZ+t^NBv+2gpGVcoFkj%AU^u z-tN0M7n;zh5}NAn*BSrcC9pF=Is5*a$CXcuIDki%!k>#6JpJ`8 z6rP7`^0nL>JSl1T$^&qkIP13dF|l5`n8kcw0Y48(YssS&T)Tb!S^0?($y2T1%fHvU zH2=KgXYQwW@`W)S^%(#@`^-jhFfdlm`hhT`7hhMLVkS}tii|J=g)YFpfo}!hzP#Ya zAAZ2crw4rZ-6INKKzyxNl(oZ`Talv*W`BJ5tQz_gdcf!2oY3;@@2u+*Ald@V{yy_= zQ<%eNz#pCcobc#;0mi?lByF3wmubdXL#-@q9h9TTJ!pftX)S?hJ-0Gvm5|+SLN%T< zeGik`q&L8aD6wYS;O@MuHPML8T#uSp&tL-xQV!QRL;HSffDSE2AYsQ9m&XTurYHRP zo3D8J@{FJMf)5`au{~};xfu`MXo1e?VJI1X@&iZlr-STnAP*iI3i6C_EITzn15=x++jXAjx3Cd}5Oml)!X;cSm7 z^p})dk`H2C%A{3 zDI_7)st2&5qzm>d@a4y^c>eYc-+%su%L4#@hTO3YI<8(h632`UylnZuSeG+( ze4_Ayt9Q>F1nqt8ek5@>wCygz)x?mt-jOf>0Du5VL_t)8LapM#P}YM)>9ovj6w6EL z{N-3h{uwxC7xVtUJ%E$K$r9X{echfr!M_>9b$ZBpf1rW*Dx5W9_IGhCFdTaBEo_zp z!G{1~7h#k;^rzO4%^2!*9L-`-TfWI**qZe4>oi zBO`V8LnO{xYx%4}8EAb@bgTs|rN2Zj*0I;Abp%b?Wbd~XyuPJ;B8{J2LA>$_&+8qJ z^>dCOKY#;5-;cv7-R$={M4YRNT#0%=tntgn`+bKtnf{Rf-D}p@(=(2gGh&ZS_;uBX zDs}xn`V-Cpl$-#W*WP=F2EiZMVpjc`i86f|#+z1!9C(3W<$*M5Plb`NhKq8IyKYQe zmXN=m&dSCjmuJ8}d`ju>XO`+hsjRoK9atDSj?DivI`h!mF=c2494a{&l|c%T->9>E z2%t?tA(euyY+xoZU-0cK zxM3B8d4PPfeDB$i0KIKua`$tElztIwxY~^c? zm16rlE8V>xr`JK-+F!~}k0y%qOtG`~w0ikI&%AACJb){Ypf^9KRm}Pq2R|$NoKtdH zxdS-PB| zy~MMcwu>i;Rs$RJ-3tQy_c~vrOKkpROp)Z{8P6_?nN`;nyBTyE_WAjV+)oXgy2V-; z#dKo^xtzKqcJImT`DMc?OL;ZrMw&ysm8B4fc9f0r>H9}~`uvD*&tLJYU;hfv&o}Hl zp=>5-G}~5%=}t0Uh8@pZ46js@`4DoFZd_JfmzuqQ_0FehyH_df25eP#4dMoy;S7kI zB{)jYS$1k3<`z_xC7@qEco4q%vgapu7;A}iqb{eO4 zw6#!ds$jqko<^W8k8*!6`8A%K1$C?zTHpz$aXHc*ylq}T*)J%aDpauVd(BVv^b&(m zE(MR54WI{n`NH_?U;Q;cfBzXDK0Wj{?Yt}Nnj1%42P5Ug6PPhaM&%Q3wtRdt|JUqJ z&=psnF;ngnzek=q0LDN$zwM7&fW5XR6r9h)vzwzwG?34oCd4YA5ql=Acx1Y}K=se?Wc{Bx(dO{iLfRv*>ga1)j+x)*F-bG| zJoIu-gV~`fUFw=x{U@&`i=StBb?n#~fUUjAdoTfv&Qs|*;eL6RwBE|<=*eQUOL36X zr%HF9b1Y${wwc2eO~)YULJ8VNoe6f2FvpriZZw!xwgO-S^9Jw*&tI>2dHI6JhYgP( zfTs@|_Ukit)RVeYO5K}x1B#p$?(zIohYLNcL#BHDJg@Q4cVh);-yF~tT`L2oyhFlE z1lX+ucK(bpCp}$LE{Y;#KFpyX;rFxbIi#zFU0#)U(w6}x@;c9nWJx6vM0@l$ZUkmG zWCZn|S$$@Kr9DK_LtQk`2f!>z`x+#_?CBr^3JAB`6-0!mM*`siU%n82{OwP8xjy0J z=O=6%`pKof-wzE04)j^5lBo%Ep0@cjdILsqxKf4->wd`dI-iiMojpzTor8KqjgfO~ z+jBq85!jts@Ls@L-W%E;8aK%6iNoZ~X!LIsm6dF@7~4XJ0w+i*TE6`o@w~1b5lT-y zX8kWM@+Yl0vTWYeyAyLP88+CAu-{ z1QIXQTh={R=48ihQmeHw9r*Po&RAxkWh;|1J!90(RyOcny@2~O@bc{$*XJEuDfsyD z0j0cv_A4$0eF=Bp8T(GSYy}cKvAAf@hL#1ehe2Db1~nsZO4GwcxH1rJyUb;p5MjeeS_YB$a|FS6g=5CGi02-8;T5*=LCvcQQfIV*<(tk|FVx2&^?N$ zhH1uN~)+RQgaO@re6thkKdU0gU&3#`(7JQZ77ZkruO_&PBzc8x=!AGv~wL>85$QgMn}` zy_12()!h@x;idXYC7p)F&U${-UxU7<^YU-ba|D;xVlf~8>|W}3Y}h+L=e%#{o4oRI z<<{xoT$*9AR}!@Eur?x-Cn;yYrs>0!GHaFUT{o)czKiqdFr~)?%?ZLb{=h8c*xZ#w zYzr4*r5#OIBWMHj1=r^re)HSkf9KI4a9|A_s&9UnhF zfi{5oszOSZpG$RR?*`pd`(F%PFgl6u3vbLr4krx^6kP!y>g^i_*|qNcG_k3tfYmZx z>{Q;-q@;XCoTFhJg;1_YiU9QTiR=3r_lx&Efo6EJmaC!5_KVe6{Y#axwtar=?|R+< zBHsTw)0mY{xxN?4F^33q*?f0^$3=euoK>wA; zWc?$l9vNQZnDk!UNN6j=Ng@PE-oMvl#?p~SXDo@6!q9cMXw}%pxoJm1|1!XPUqS2J zshB`?!G0xt{c^=mU!GAw`1I)sAD#$=7XY^k$e4k>mRJM`?lnFi?NCPxxa&TD1)OZJ zGE~_2URM3F7|&%kit5Y}-tzmkEi6>Xo?#%1b%qg|&0mW-W1%ZGWWQ%NLjTL-yW~6l z%alE6pVFIW|1fhyA|fSGDcE zpLt8!{NK{yjK9d~!i7$xJZGqHyyTr{1z96V145CYeAehsv%=)8R+k8F;#b$&`ayEsO^?5TgmR! zwyIWFPBlDSAp1GBvhu9WJZY~f+vcD7SVH;=0FN3nYwWSZ1`eSALTMr#H<2p6dLpmW?qcjKL?o80) zqfT_1xml|opYFho9xqX3%}eNZMs##v_wT8DJeEL%_1Tk2kZMy^b+uOuM|nkeQ8Ic?FKo@ruQ6@%5_}tya;h8P9YDvZnBNop&3+&12!dqksO2DMMA)aR0TbH6^0f*p z@|h=%oKum_-@o}Fkd~i(ug9?T>vGk5IOh2qLYY@KBbtYqjy$8E?rWk^EQ!pr{7ysO zw}C&Yf!UAg&$HMtZpd*hWVmfknkH}* z@Z%3Z;db3|xor6G-4h-zz*cVH{novCx)drv&W>Q%(?`%SFx?0(F0>m^J$L|M{4bpc zMaK^?#l+Ac=vG-NB4TOSH9`N$@hW)zZ>(>|TSK#6Cf={0xak&8d^%>ZK4ee^) zT@1+5y>`wi)3#F;$X-9z;LogmRo{#`kZC->3jXY0n@_84>&BfD9WFa>U4sB600Buj z^ZZ3MdE`*bC(imkPQE|*e*Yf8_?+SNh8hda50j& z3a1_HmyppuGpm)vnuq0Y+u$mD4)dVQZd6@pF36Z+vGK+XcM9VLal}f~RZ7J~Ni06KP)g zgy4>`^m~P|zf{T)<7D0;X}7#j_S+dZ*+8_9fltqsFCI+~2uSu^-+2bHobl@%3ssYI2#sO4=6a#k7XJDy=J6o z#!*hap2kz>2H5Kw>sR2PV^rzj`)GVxAwg(|Fo1CXxHTS4nLEHJ*vbWj4f~aFecAEt z%L{HVJGQOh^049Q!v@d`2sf0{f;->#8sHgqDYdk%Rs8@-Yhr0lEUs!f>`@6SD`s-l zq&)%LXB#)KAbYxyEs^w^*Ni_jVub{NCO@XOuGs*0`4(58CBLLX@-U(~N?|m;Io3a?(OddVC zR=tXQhimoy?N&F%R)-^ZrmJZRs66zIwO_wJqilo^A0P4I;{}(?1{5^#cm)^kN8uR+ zcbe3>R*k@9xjM&Niwa=WGiryXT7zL2-B`afxJ#cA>^Ea_sQ!M@e@FY{o|&WMF<}A} z<#*10d{x^sv+}jd>Gfl~>b6loi|2KKJW}$tkn63~%SZ9&^HXVkrvIl-C(OoTE#SHT z_C7o^tKDayP^AmYKcUZhKHW7UJbF#%`;T8U)|Oj26l2l4dZ{>hZRJjBpBa>ZKy=-) zmFn>$T);QrdIg@pUGeqHH!NU>0w!P+H#CcNQ~~0RYoJWtca&1_`THk4eR#n0w-7F2P+E<{Uj6(oE)i>Z}j{)ffA2VOs}8+^Ty4mRt_59>Z_u~n{~Nw@#!kB zdJdggyV-9(8sfb@&1-n;L8Uc4Mj({Unp{|)^K<&|UgcWu;V_HlE{Uiga*l7M^f;`x zCub=7MtJ6$PDY2!+Is)vOQYde-9`}WFbnJvFZSlk3w3hTcziAF@?`@66fWSs;P%2D z_%VQohYJ24o;HAPeLIuH7nOT?tK(yDTb)Xmk)?SMBoH*PyY@FE=X);k|0p;uTwFlg z-I zu;T`5S#~W_U{bI9t)=G>5V!mISYQt6GOM)3+>`*oob;9NE&Pi_-zMr!0*-#JHgDpD4IK-|*$9XIyVL6av2c{1J~IAF7!It`;4eoi~OCa+-?`9s8=Z zrEov$KewSN3=B7cJY%$bpMh@;kLYL^4DWjIcA&C)JZMsWgy9X>2-BGHsvz@2uv+4s zzqbFLvCq=`p7F@j4))X{H=TWvT88%)oF`iYulMu|Q=XXS<-9k4=A;SUeOjmfxt>{V z_vkt=_1pYsOh$9meCPasCmRTLT<~EgYci|+I)ALp9yH<_x3=#=BQ4v>R<`a`AfWD{ ziypuBuNeJW+FrXIj6z$B8Axq;SiKr#C{lHtIhosu>^ZKUE>_QD=5UZVJ6d~#SRO{} zj4Z=Y&0N;a(yego%=VbuSU#BpfNzrQleDcoVMq%~Y~!YT_5ibNF&^W0RdEf}>^5>5 zux5vTXLi7$)?+%TNCN_goI?#A64w746kGQYas!%;wG8UjxPrUOTTfoKG&@(XA_%uO z(JS+AxL$#m>yGEIFL-%*#&+58-FKhx;nN3zcI%$U9BY z4$Nk@bkFX>Ir~IcUS}BlwJxda4L|4Vo8hjr&GP(aJwjHPvs-=703ZWyn~mdV;TK2b zHil9dWoO*Z(){fpa7xpJUU&QL-iS*$Ehuuc7!UWE3$Ng^Y5!jBE1DeO;wi;Lc(6kObqQV7p)sC4yJSq1aK4{6 zvh*8AE(L%qMw)@NwOBfy#&3O0{o@|MNy3y0E0nsb{1rY&ZlgQW(|f9T-}~Ky-O@^B zUQ?pR8|XO5NV?tLjT*WuaRB?#apvabYX?afW-p-Jn`i<{w`=0x#cgczM3zdcEQDaOrylxk%JOwiN6!3(4+XGpDLjPBoUM`@{myE$GRX zkIvcL4D=1kKKaadAhhB`zKS5%^3RcHV&(Np=WJ%dH71PLBOXr$9?L)V_!h_cGNWgN zmPd6SslNN$>gThz3`3e3#C*+J)>S{07AN?3N{ba(Kj)8Jc{7i_P|!&`{5UnKL%qhx znNo2DyfJO-J?i7s6NBPAgHql{LqL0brbXP1&@&@9Hjf+|hcbwL>sVosm1EpNy|gJ5 z$)Rtg&M~6qspA6N2+Re~&o_Me@hh&kx^(;Su;D}7=U3zN?RpXy)v-|8UOgfSzN|n_ zZ|7)1n~6FAv|(84mV1SHg*2wE{N^BT1DIVG$pK7*5zww?h1G8qOY-ByV4xIe&AEdv zeVGZZBhTE4=d6S8?047X?g2bJqfdAm5a(LI4(;S=}M!;-Owo&kB_NL+n}``!ad?_iYeQuhtsY6SM@ z=Nqoq9oPK^+6W&%KH>4{p$6bALVz78gni$8qr^Jua$-jiG!__EfZ&#Tsr9qb?9Br_ zF*a7E3g~_ptLY9zGpIRQG^1PmN&A^8%J$!^6c4aSVw48Rmap?ww=ZJ(~^c@K_F0i!fn4UcB#pdlT8L4LDUNU;%go zzW^^^ulV})1=s5hM2v^W2RuDJ)a72jLcE8)knX{&hc)a41lm-+i?@S5$jM$g&0GK1 z4}P?zTJ<8L_d$SHzZR~v@?7A0cBG5InyC2i){!8|o%b(UboHt)q!l#Kw|UaYoc7gxR(#YK`yK>;fcX6ukoJ9t2FKJ5wWzn! zp&jMu?<-I40uF%=0JHMBUEr<2kpaHdxPQ%Rsv%|S;g5X>b}scE#=V}>dU?Lp3C=q{ ze)@n9A0O-e!r1#>LEXG8x16*+7_x71!r5^G*i&RPftT$k90yYfux2Ep=!p^9y$AZU zogAt@&clnJ!+SRk5&#(K>B96N_*sWJr5;gl_}oh)4>M+dopq_R6z?-$xi$YfA0UPP zj{Uf|7h~V=J4iBbMb^?I(c1fWh(U4y=zH`U066baFyjyVpN@xhf3@OhQHY}#k1DEr z%On+3U+J-m#Vx-Z*Z$mC@o$_XaN1m51{I-EL4ZV$sILg-e%|VsYx~RrptJ)T1=s72 zeJ4DByW;t$EBFQw?I;`J(|3<}c-R1{d;DadA2pAftQe6j_rfg43O$@RuccrpAhhmJ zS(a^=8dLyi>BF##z#2F@0c3q3Wl6axXEpGf@lyAs61DX?J5zhda@SfM$T*lQYZ;R? zC#Td*zf2QGNAuwxz!_*8I%Qm3GvvF{B(bb;IAdM6WfF}Eua-Qs zydyZg<2khgka)B+S`T4&CL=LzNJ5|fb2`7?Ml*iJn@Phbc|75wO63!!d0NmU??iI; zUn6YH$7Nmqj81oqv7^MQ|9k)d=iu+XpTx98&XDUK3mBVw+>YhbtZ@$P5jC%wPdNH6 zXQLB9xv z1^|1#i=J<_)aGo!zSlYg{DnZx{aQ7HbKU+u0|0x$4at#7>-RjW6}>ix4&Zxzf2)gfl_pTsW+^QD-6V-O z@0`jIVAl8L0kE!a$B-!mm8kH-f-LZwqJwr^x+8~o*qyhir(=^dyP}bJczWp zV4aQCOpxVjX&7=dT++!NDhTRr9OsuAQ<0MqI1&8bo5gcxu98c6%K`XDev?G+GPp@MU*ul)k60p5&_K-B5^ec_`SoI>E2kdaKCoy5stM!w=6l z&{pvH_<+m91!XIsvIErqb+|g<=fTG9o&`&Vz7!IP?FTz$){rf?-}Cr+l5JGNW+H=! zd>HBoOR%A#xff^7+^$`BJd}KK(O)>3xX!g_jGDCVMlgglbI^Y8V>OoH?4;Sb+J-n_ zW|T=OJKO9{C(>kj{NCTukQ6&{MKYo32uFPA+M{-_Ei|5dZpqWRrQdzqrhcsOn^`bp znDAPZWIUq)JY9V(uh%`Ju{aV@JXo?PO}3W^u#rP=o+0(K=Ly5-Y~>2|j%m<+Ru7=@ zIK}`6eF@r)p8(0y;`v=_Pj=vTz2V!JuXz6U4B3D8@u}c)*|2Q|Wdrv8)|?0h4-XrN z2)Em{#NmS_@9F_0enPyx4V`$U&@*(Wq}Tk$viM&@UrwJ^3hq1FH`@WBQ<=nR)uejbSO={ey0xE=u$AYI154b!KP_zVz zPbkIt<14`v)4+zp!O`U~+8bgwXSe*a1Lied7#sH_e!udal?<;27YCl4A{y)>s)%YEiN?o=LDF%Qr_dXo!X>+L0jAsXeK-&XOT~Uu< ze#Loks~NByK*qHoo-*kEINs3@F_2uVhI*i*=Gt(3xnaLDZr2^(zCMHZE4H!$JLBoY zhRda3E4BW8-%;9K^0iF#z2MveI9J@n{Yp2v&JC3x~u>aIf{AIm^y?5dlBZ z7J^rJMeywc3lD;i0MMU3f8n@XHdwK<1{`_$X42v)zchv?txkv>$4!$fRWw*+jvytg zoRYQfb^#_n29sWtZIze+K$+-rC}cMm4BJcP`rX70-0b^a8Iz%DYGsfUTypyd^WOId zil;|nYxsET^@LTx#9N0AZ)nZ7}skBljTxCh4Jus!NbD?9{QDYJFvC-+EsSo zeIz3*4Qi#-=oe>R>#wttHJpwl6M?J~K7iYS8S?Kmj1s){IOBO+PP}(CdludmZAS)g zIQe!CNX)1}hR2SZ9bpX(Z@dGJRPvlu>G#ObGXU~DWir9F5>h<*mKmc)OC|58SpQ7Z zIq$&?^0@?=GMn@xz08crGbvjh%3`U_pRv71^VZXDmTOgN+CH{KrAf668=gx51uwH1 zT@lA2wyeoH1zoy_)ZNnA_X#QhB(9-asBDn1FwDTq%N4g9Y+Wi6Cz@%SF z7W$HLe4yzvVsqQaL@f3;N}H3-uJV)6RAQ>~kUp7wXP9iIPmb`?!Ot`46%!xfMjM8V z{^iRT8)tdA$l%O#7Ss-%JL68tx-gT9!fj3-((s!t!nd(0OgVTF()E2G#tPk=SI+ML zt0!#@fNB5tzy{{K`1I=Di@hGn(!GR(LQ*S803;fis^Ih1L9WCX?DbJyD!$zqL>CZk zxZO}s4)66a%znL9i;rvh4-Xey9yUBYUBK9}T`C9NxGq7H=>u~;1>Kp9)mnz>f4v^a zT%{*Nl#FeUkH|cX$xIPN02T3EcT`91%$mrT?Tv&km|ZI@osmA#N}bIV%ad;6cjT(A zoO#xKd(Y118C>AxQ%oIbkhVyTDTH#4T9|oSVlUtRye<^XjE1Y+rH!ad_~y`3IVtMhKGlOQtDNs50~nL zBQe(d%~aGwu&7$y`+f5D;0HN7Pr#bq)!X{s4w7_7i#Y+Tp3)XGvF#Pqcz~l}XMq@* ze@i1!4y6pd7@bFEIoRAUoS%%6`E!C7&WqPm&(9$jGAT)a7M6h7rabE08S`|7gfnaP zoEGp6UI4(Fr817aJz^}tlZk=4`E{s2C^?oh8tpe4i)Z5Qom23qOAUHVzkxo|8$uXu zONHqck?i~P&%W=?qVa*I~Jrj#?Z%6kBmBgwrBMY1XfKG`?j3;|t;PlB7 z95d-rm<`H`4Sd|&Z}mh1z&f6U^&)%ax#}i``nxwGNn?H8N9E=o%vEYilE`F4M8vaNDazN#)We9NJ!yTmNnq&DMv`96lj*4bcUX zcwFUuGQpgcgLWFsrrWunK$9_6A!ob*f!E?$P3yv_dS^x zwt6=@n!NE54O2<(exyi^BCOaJ$~{@_Yqzm8<)0$F^Ot?*uB0QUKm> zZ7*Lvps{TilxBR_((2gpegm@rOv5}z7D@OO8Bs!8nK37S+1#c`Rv|tyl$yR?qqQ(fPo7FcVvk?7ZuzuC-0B&`gjWJv_-zi}xo$p@T{0#~2;2 z7u)1~1dbHm18`dnF0ocJ3DQ=DziD4+@h&59Ecc#q$dGqb+ExfPiLBx*XlwJady7(m zQNJuVri+$22g{TR4G*G}QpLrtx0gs8 zhzN8c05@;}K5PZVHRJQQTdjecaO2wM>+=n_XU6l_Yj5GU6>JZ;8aJv`;UabS&Bh>< zvUPBaqI@WzdH~m5nCZaH_^pG#ijwPZyrXd4(7f-rc7ZvnH?~Nqhor!|6I)7Ez991Z z3Bkj%6y=ReG<&6kTvZ6mW3q=dy$@Ea*TCXQg3gQaNf?p^lgXZ=5qWjNo4QnBXOB%_ zg6ir-vHYq5zEzv+aI2A!Jz`YZD++}Tvi7=DpAy`Bg4G>-a!2GX4``da;X=W))asIP zRl|dZ8eKcw2kn>V1);i?0W^=OVvSt#W!tJGB$ZXH1Fjn$Q?3jr6r^c27PYa@0|gc_ zO`X4N6WL%U+3p~QynwBObHBy)<}p$XmV*W~i82JpY_TtD+( z4*}k|$7=JbEh#~z;GQcoZ6s5hAG zwVd0_j#4h*7Oa|Iu07O%c-;g5?ydZ-MVJQ!+_bjHQbk)f_QF~Sts|$NJ5dxZSEri_ z`mJnWFmAUB0IN5&wsF`9Zcct%Z!uZ^G7=@#7s=kg91zq`g^(hj3gAwUT?J6EjTyrQaL2R5&l%Kna)G_ zr{p)OLk{nO8KsnZ!<5;E!?zu>{JOU}07Ab(iU^=mL$eeDXsZ<#+Ob_W)Bw$>{sZ1S z9jd&l^7+#C`5J-BT#n$Do0H)f;RX4PLR5qi?-m)(1-;h z&YTGYHVd*d_oASCcwU9Rr(JG^r>8a5N+A1Nba%M_Tjn%nX3B>AAPq|-=_Y1wr+r1K z8en5j-5J5uTSax>h3+M(smU>RQ}=d)7-dz*igdDWf&q)xw`oxAg691y5_eEeDpw)0 zUw7~hTrSiOvrtopy3|0Rc56uuNpsulDdt@SCiaG-WZ6~$nA?XUOFgFNdV#tq%XX@b z#H!v=wyn3R3h2EqwQLMxuKnq8xk&?mhy9e@CzI)Dbgl<(a$q`c;qXCrnA3LF@d zxms4r)ZODe&JX{}#>Nyf=nVt*@s_F*rR!j`gtXuGeu@0fd-r|_01=uB$cUBLYZNVl z=>1K+w+^SnfLPhSVFoWwQ%Rx!7g->DDe*UD6McKNGnjVR#?*bTFfeqAGCf0??vfcN zYXqr2wfy4yFNUnPQ~IuVy$V3`-cJloA}p-szKqO$RHmRoK-w63WH$H$ zsGDzr3W7wygVZx<=&g#s2_fSd+IzlR7ua%YtR9%*YPD_^%xy$HoB_8J&S0Rh?mEFP zUO;Zk9a~dmHGSO>Z7fM6fcvhMj#dqjG6!zzdPrTS-U_gHOL%VP3{iGk!{R2B8?*+C)Z|MB{`NtWP;5-!H$R*j*D%hq^xZw5LWUaoEKVyo2gb_2`3qEM0nNKtNWFk|zKaoW_E1;{x6Yj5 z7Tvxo)iEKfZt2EZ;wTaV%iLC78F^~{gBStw`{2LH+4OBs?9ZSK4&Dpg5Z2H7W(|D< z6geqUdDy?FKYRW%97vnBbJp$|0o^-;wx_Y4vx@Eke_5Vs8AhS90Z-`XgeGM-;AHk4 zWSdXTs#YSJ-9ktgz&$Vfl-{Fb?vCu%sd{gi(U(J%fusQ0ucLxCn@rr>#n3%(Mls5A zY>`kkyV-MAH*}kIYt>v_%iP^$Zs1is8$`G^t9;+tY({Q?tSuXh=fy5Xbc$L4+%4=D z%gcB+h_p@U9N@heRuOas)DJO`*2}&gC6>84#xD1EfywO(sK~NgZ;PB>rw$lx>#Vnj zomV9f{W7LIFZ?K-OSJgr8H*h+I1fD&Q_{qT*0j7R!KlQ(&G;FAs&i8ga44+j)&%+VBTZ&d|GBANYrPyS9elPx|Mmm*e_WSrrvS!0dy*}+b?{A6OrL5L8RkT>is z)lv#jsC2M*LJxvalwV9Atf@|9f`=LuU-Nlj)ID~_H0c(nfVK{x{j#yup|Z5GH-RG} zOc}=t2?;sV^6oyCq21S{%LPie4jvf*izqjsSiW~lTxhXZ+glW+8vzmA6+~|J0uxhF zO;xB0T%x@T9u?}`_WtM%Fgn%&+6SfIt#C!U-C`jVhk(rZq?58Maq8pX*sTBNZvpV2 zynQD??^aSXPqvgyys4wsisBn5-)zyP31Ke;YMJ zm4Lc#tFqg+S)0IGo&`8;s3F@8+KnLG;>M^G!t93=StVoKmx&d~2_Nb{)%M%2?bNU@ zmKmeTr%Sp5fJ-l1&Ix<{iN2Rwc~VEz8f8WXb&yNub1-*|4(-Qc2SkD{7#Ak;>F3_` zS>g<)42Iky|Ej7LY^rep4NW@j7InpU{ree8bb)SqeGkAp+v|+7p?;Zo&Iw_FR@NlT zUvdSTUGCLTA7)>X04r0D#Bv%pa7$VvGI>n1Lxga%IE@Kx&wPNbe~bHM<5;IF1A47b zA6OMEa!PGHPT)6%OaHpR)6hu+j&_NqVAdSMjkF)*aB17^G9p0(di%X90$>?~*Q{H* zf;k-$?tj?`FS~b7m()$)%xsxYjh5dkDYWI8t}MvNMCr>2Uq(KSwXP=_&C*c#?7&~- z0kPdk=&$c7wbh(E}9 zi)M{^B>>QRst9Hk!f!Q+%iy*x>eOXN8Eb%(0bXJE&S;1^uNmpyOC!J)PuIdqTfXhQ zYi$TJ2BPsq+vR!zfT}LY(Y+WtJK*PRl~#7q5I0tqdiytWqz<;UO;&!Kym0N)L8$xF zcj)8`#*o!JBFrs|*ttGo&AR~I-RST2*}6f$LW=j6>8^rng$+xzllmO+lizqMPtJAx ztw1mV`>tZg$g0pKz1MR*mS^;dpoJPwPxAQ6D~>SMzM-#7;4Uco=ioVDZ$W$LC_xJhyZ3hWQ7M~Kyi&hW2i7s5RU1_AHz3>7lzQq=PYB!Y28C}vsK+>k%YMn& zyzM{j0xoRbhNm305DMc^O2~#w8a{-KGC;b6XenPE4L(bNKF$McDP_Dl7Krra zcQT*ZP$ejE$){fJ(ELCEAxl_oYY%6 zq1ap1x1>KtM@onZBilprL=9AwTE)C`DIT zCBbv;Gdd+16NafLeD3Tp7IMSAs;zvno*wVAQ}>*i~2jWN8$Tt9r-%RrTrd z0t1kV`b_#WEDfW}tad=d+qo7{1FSKl2z`^XC92wl3hHG4i?Qugq4h%oHRsk+5_8|w zY`g82*Zl^)(3H5`?%%0y5CQHPOOwitEI}!Ba>vulwszk(0=3l&BZ$@I&{Mj-fRUdq zq#5QwGWQ|jT?jWWk%JA+kv z(pH&Y!W*o9uKru3jl3~O7yB^+A``>S_sN-SV!rn}^q_$zTWF6sZqdVN%dxnPwZHv1 zP5`aWuyx2zDBNDOWiwd9~Iu{V9otk<1Pc?MNEg9U(Yt6{^#1}yh^K`O`9MB!(~Gf!bB)P1(a4qKrZ;rtFr(|Cb|e&V>D$$tGF@>Zm)!7 z(NtsLv0f(!W4ShOg!Kf#Q`iAy6ZsxP(AND+TFCt)Cpyfw^WI=&|#Wt2bEQIxHwD0|db}S2M-Uq|T zM%a@Bs0N(%A1$yW1Dp(v%zn<^?;NSQbaiQji_j z5o*-+@!X9E(2yes$l7nqXYo;>U5usn&#~Fk^(g_)T78e@`P;>xALLFY zVNGfo51!j18i&yU-QJ?Xn1yF!lcxh*qH$#+_F^#=GGI1?4iR=7J{F{f@-mn+)Omy& z??jasSAhdCMtAYKMz|0#S#5?9T^yjnx_w2bX5bIub4-^sV1^Z$@}9*dz*%E;50_X# zzJX*ubU^=@M1RUyNhIaix+RtsX=>(r z|0M05frO_zPUKxF6|4ZEW%P`8Od%GjnMiR=OA|hd*;p;MMyFwdn@!JESQ~*1UG8Jq zh)w7LT)W4si0D%=3ELk#^JNUo-WLm4y-h4xyqPc>w5&kKnHSJ`XS|lq614Nu|=!yESS(Q41jNf z@M`!iVvT}eWv}Fsm7l&{#m$*2e>;e4;|42ZyVp$gK;vf#ze0W1S@lXKDxvTmf))7p=<>-q&Ijt&hbK&#RNr*J4Z$+LHDBc z+$yiJlUkh}`P70SheWu64-1fVc|(J!0`0(w11@kJ>>&qZZ_!FEpm7ITc;RhmIoMR` z;=C0fwqVQ&fQshtG&XdYS`=M_IYI2kl_PMlR=$iiy9Ox;F%zj1$85GYW0*BdXlj>` zwG3@~WWoMZkRrx*Hs5`IuiLm|BVQ6inVQ@;fQO9ai7_2lHUx5c7(LFV{CwNnRfR+t zJwkEeJ|XwHVGWgc7BK;YB{bj)&?Wj`LrUh5yn z!vbCdYXBa%zI25gL`9`<79sw8+V>CHe2ThZou8g zWYs!4&8)m;N{7mwOPhhNa!1r101SSyAVbDKG6SW8uC%@l1gptNA-i z69z(ry(~v6HQCdnB^KW9{;fEmR!av!BniBiPMOf2otXxc(rfoLV}pZJdzZKXVNn zg-tY0-Jo|XU4g2r!wSf1#@A&cYgG-kb#e|hr&e7^5e$Cc=6fHq^zcGpD9zOwCtA|} z@X3n$`JLqX34JLkiG(){wTu1OXzcd4+PYfa(!D={7du-k5Ndd$_hSy~(++||gL6`N zR40Ip4Wkp2zc<=7JrjmJ6mQ2NKw%H$TBkdJBFbj30VEFTb%wT{Mca-}kp=?Q@Kli4 zy>>)HuR6!N!(Fy>>>U_WbUt#Qn+?ujaHw%K5Y6vS{z7?F`BI}4NS8hMs)g7%t0lBi z52B!-z_oq|YXE6oMut(u-=+>3u3_th0)GIbgGuUXopR9=*m9ZhjDE9fsh42emu)pz zJf|>R##pZam07a@Pe8E0GIO{C&dg4Zib>|I{W-yJeSBZF2auAAr6NA)nCZwA2xgT| zf!*TCko799`C?C2$t@QOW7rqRno9(r-;ZSz>uFB;X^)-}_WLgcfQ5iAp7TWj5^!@T zsL?a);+fD>dhY~Df^O0Z>Q0wGYF6#2Tye4kqVsss5MW&lJ)cT_;V0F@?E1v%{PPXg_SrEs-n=ek zl<(qgCf?ZK^i8ig$QT>;Y2+9`A0mrQ%^y2>y*ZRl4c*fxSvwRo^d#LLW8??1_O-`3 z?8c}rXG^^b{4(<_fd`XRe8{ z-K`2cZSTc^5wk_QWO&KH2m^ESUfmc*Mm>O*R_q&)wM=9ikN~VSljWp6|+G*p)7ENeLLv7v5GWyI_ z?%C1=wlwpyCw3uN5XRqVUWLuM1lAjnjFBFUQBL@0po##0+lT>q+e1AT`mk-XIsI$F zpGq@lpcz_pt_+y8o;+m&Kv{RXeN>91KtM zvFp&_gs|)@EH~@{T=gd?g(E_C<+#vD_af)JpOs;J;0@?Rvx2}(q*#mtO0DyP<#NsJ ztyB$vU?v&VgAfIKFV{Rf;%4x+SHg_)ZnD)S5h zw<%s^nrHM!B$51k;HkGXx|X$G8^h+;$0qKu%P zoY)=h%XR%mU##%iTfh4~fT16D#mVZPOf>c1j^)nl2jQ*Hs^P1~H4~@@hVJeWR>RN& zq(;1Ws+RY!ce04)Tv>{`z%agJ>+7nCx zYxLdJ?{+VoTY8fjVX>6SspT8dB_wy27kOejers*86EHBrxTEbJTW~BVXRBO+ub_^+ zQMND|%?j|LSPuVRE7zGqjXu(~w?)h24gduFMoy5@uqewLLq1RAy2J>Xjm|1jH?*?8 z@mLNUOSW&)H%&Q`cM$-cd#WJK914N>NzPd(B%dAONf|V&S<1HF05YSiF*hxr3O_`E zc|MXdTIQU);+wd$y zC=~&AeM#8sDhK2OD^W*6BRyy_$1{5?fp5;k^ zpv6m>liupENf45u{?(qp*iE+t?AC{od=K@f@1-)MxLwC6He>+-C&>BkXJ$-K96;_0 zq%aGsP%d}LkayxywzkuU~CtF7)Cz! z_ZfHlmP(D$+;nZXhWKO;+gRwzEaB7BAcs7hrt)E%V}qy%&bPO!6B=M*LO+RNB3=7^ zf}UE@!>6s&5H!KYcZW;*LB7nBX$;dj#qAzSU3#8TA>{P5qY2sE$JRS519>X&mJlQz z*1Vy<%p}{aiUYNwRSw|G6|7B%k=~JJ2s&y$wADMJQJn8 zkh0yQEqqOWv|Q#U9Ni%(v&Si{LU&A^lW!>9)Sb|U-84--C$5SCqxf_4j(aJY&l76e z!%Y2FB3S!tEMwFMW0?*#9%;T%`VhCVzvbb#c{$;+GSZB-?NpB+cvdMb92aM1VCT;BP;z4mR-S(EB@2?A&E%k*?M)he zAEJO`li4qqvw8?%1WXtUzig5O0w4pZ?apQENpjMQx<2G&A~~l|R0;{*<&K3-z8xNGTT}_z&|4MSSycx z5e3)#>aUV=o|Wcp85txc^i;;Zm)vt>9DeZrBY7V zoqi1mMdtZ?$5Ye8mOOB7v{fB(XQszmS2+2b0kZJkUAY$15}5;j`r9}Ld42XYvxK1{ zn;r&sxiWN*-+V@o2B)Q;1Ypnl9@`J79;-Z=pO7Agq04&XK#3Kd0dK4H%lZ)+?fx<* zX=b#VxE-e5us`>kzPN9Y zXT)%2_xn;84f?Bo<>%MGN}B(NPTm$>6|}! z$=wU##=)SJG6+`dQS&)_)OjR^6x6!({1H@z!IWOf8WAZV)A5e9%kI0eDT10}9k=yLS3*L|kUzG$d&35olN(DHlsc4>khzbCl3`5m4_Ns2=k?6#luLbfJWD;4 zlg+2dz#jI9aNUW{PU{)LW?(=MUInM|pgz5=T0d~RiZO%d61cYq1viC;X>Mo|Xc$gH zcTo|I3_FR!0Rr3GoHntaW+IX4t}UtaPrM^I;{#)q4sAALEu}eAN^h<8;^BJ zS3MlfLN>;}M8KE!v(erkT!}&Kb=*oA3LiF!``om~QwYh9Y>xv;dx_@5ZJQiCSKSjo z81bRcwqe2toV`y7N6EWb_KeUOURpgX%Qccn#1i?eu^I96nQqHduYzkwRpQM-F>?xV zvl<#BbKKSFw2i0SD-6zaPb!=y)C#)`xvocxg=vDX>~lu4vQyfC^dRu*lcw$u_qIX8Q$P7*_;OYjnbgpmZbE@Xu+W99 zty^yu=$78(p0dc;FUHXZ3XTV|Jj4$?mIYw#f7S5l zZSC7C$kDjVs@~Ty4@H@`)r9UjwH*!NbhPE<+t)`e06Yg|4VYq|V;q=#mUvLXo{Tb3 zwg?HavHOpaPpHh-yFE8QQ_+A3Y^A9am;J`t0fORKS|m`u@M6SJzP>L zJnk_v6KN_Bv<*F~naSqDbs)@F_tD%aLS)9nZlL!}BnHARMvm0OBi}d<==@-A@1f8d zV>k_>y%#gylwx_V+hU==r<9PKR*g%bmRgC+)J=IP5VbUPcgZdvt)GftIT^=(>=#A( zW!mS;NW`bTAtVArYJ*HDQ<*}ouiXfAvquSL$J6(mL?DmQ)v}Sfn_lgT5yfTjTW@mF zU*(FxftInER`_Q%4Dvc8n}NS9f7X!$NRuP8@UA;Lj@onZT#l10I&wBmnx4<+ zf5me*evC6E15t~*T$8;)I(C;raTEkJ>u)x{%%45DAyjF%i3hF|TyJ}W57klg6w?5S z4^_XhdO)b=Wz#V0?dT*T5rmAsEN)IG`@Uzuf!yI2XUk{{>EU z^t8vR0P5}A_xf)1PMW($GbJL7VtGzJ+gOYV2(ovJ7xAE(B~}}@#2cCBlxF+Ah@#%% zLEFMR(Lo=z{miU4McDabl|6-W26$+(plNdlnHC90ItKd5xcPW=9>myk8Qeo(^>P9z z)V;gtCrq`!Htari!xd)A*fDUSv!L}@-s`0e;LfwDe;+`;>2(j|0x0l;=X)!G#w{u6 zGbcn zqxPB4y-TDzE5)lPfe+!e0Pw$n=T-PI8^{w#a#+qGJJF1aw?ZhXLr*Hg3%%}j(+T0Y zLTmOXh$*S0eU1*Skp!N-y7&?e;MylrR=hgxD_Kxun$hbCCtt0A?n22x7O$&~!V8ux z5g0olAv-!AFob72ZWb^=Jq@;Yq6UW46B4&HxmNUH(++w|9DPg$kYlewUS&y@SoaHd zP9wt3t#48WDY$STUx2*>W8QM)-X0Tu%P#NrTy^t#q5QISzo#{-ppizMhr2RX0On#~ z8h)1jYkTvu78F~O<68MO3%x>vGE&ee`TcDR_Dz`YY(Iv97M^VlDgp8JK9aPc(yiYU zjXtv!5K3Jl4muDP{;&X8Ll$M;Bgd;yC0*?#Hp`mkRv)ORRmQD*^iAwh@1f)_-<-kK zWtjC!g@--GqfPBcABzJNDq9J52~|pB=n^)!?Jw3;mCB9xO=M51A9QBLHe^sp#&9N= zEdiwMD%zZsgk6fa^WF8u7EQKprRrce265TTah8Rzd;UlvJdUZzJksB0q(*j0;F8SwGHf)X{*665q|a~+aR zqbdccx0rN*X#{j}%U_}H;EL3h903>9k@w!SP*3cZWE!|*FiI)l-QM^?K&eZi0<5T@ zdua%80fMW6Y}1J%wrwyYLlq%VI|azjDrX}Y4KQvVn&^#%ypsb9dlTyw)fgve+p}s8 zqllN3N<9f)-&cQZLFs@t#=;{a1tn(xmwH9om?lb&EIoogwFW{d^#|Ie-)2v&?4uCR zHV*?jm-SGjr zx|~Nq__|PaWy%~P1uYS<_kD!Y@8XyE0Rk0cPzd0J&P%yrsGw9M#qw(J6Tsa4`*3VD zZ1l2*YPS>|V-z!&dmUWc+P7l}!U4d%ciNJKu9A@`LQA=i7U{!At|(Yk5Uw=!6Ehq) zfl5M?r-~R;R_u07YmEsxBxet|SsGHPQxu!Oda#qx>w!LXte4YIn*M7C^1cNw(ts3d z3>E2$(gJ;tnyn{PYxpK<@aoC1&6zx_{F(BMuqewD(OZ}gePs>xbJyHVi19eP3E6d- z)IstG{bsO6@3{x?E~J~_Ov{M_SKJGmU;mtN;GOILVL>CHRRwIVnKU4UsYD@BJZ-2o zwExGj@)jjnFHdi~a7F-VR>D9krc;EA&{VQJ!K%n@U=5pl6TQ#{sw&@M&ss7_j0zH% zs|Q1_3hH!kZRmg}TDRQ;LLe%D97GYtwfj2znGz}{9l5?of!S;5!mUo`3b>p|L@5Qb zq~#7GG@{618W9eiyI7XtWgG)v0>)dTAaWOQD?qljmr4btd#4QyKMO4+psXmrOtP`g z365L?x3|lJ8(pGnbWs#-7~IfzD4R?&oh-xlgdnx8BX2ZUxYJ&`$1I*1KYwKprR{^K z4fN2KU5@PhBT)scqV?rjsK&+<&uv2Vc|c|i<7^UspxR~u*>V>;mEs0HwyBsU{(eQA zcyyT?Usb3`mZ*MO^_7x7XAL0IAl|huF-~;vtuM4258{~&%a(2nfdk3tAkrY6!1U<|cFdOFP;~ zyAp~}n&@8eF`wRKfA9#hu^r6-*EDbVJgV`$U(q9aRA&US!WXg4wrqpOZFEl#<*8Vc zcYz+!%W4q$yT<|iKjL!^L`HaK)Qh#Em=`5@rKw9{p7ZvhRd(5!R00TG2yxSF$1I>Q zO>M1F>p9-;p*?2rDkKFXNul9;wD63-Q6k=3Fl$Z4g!+=Q-V?sF^YHBx4bb%;XLuXaVvL1u z2G4n6?l+s2ukztAU=Vix>l~2$@z7M9NyBn*ACKzwRN1AeXw|lpBxq^9S^sO@zUzXVV0Of#%7*>WZ zrVAM`;?_2z682^0beE<0)NhD=DD+E8RqJuqrc;4g;meI2XFuYm&oT# z@&DyKXS}*+%7~9GLxDFVbJsf+8a6NW_K;WA40H><*GMD34&KTBv+*VdK-R-Jh|qKr zF9?2})g2U!v=Bg=(9BIZ0nWJ!j&pFpmjvfcQ=?aaWnN|m0#@UhQFfRW?(~}x`ydE@^Rx1&8ffB~poIQonRDK?z+>QX)7D584_0R2*m~Z0$YbueNGYA&=#h=z zc-JY7nap?Z0c$T_t-5F|E31}gKdMpY<|fd=xzLwPo(y>mK+N*qgqw+cqv9Un;eZnh zP%~}k*yqKGR0F)7!PN6jsoUGZTKycLVe&mK^dJvS@@L;^QQm7nL@3MckzaJXH!H}S zOqSX7IRIP|ZYFIPs@Zro5E*PmxVIAUjZefQM{VKZ1KOlCz=L(-%B>YqEZP&5wqmAi zs90ANdeY3hi`TEX(N9`2S{g$uN8vvTRUY!DjA1-#nR(#bX1#o) z$Lrq5Q_Ai?bTzwX&)}oN6~BGp-j>C37p^3?MBhG{tqpE=o3YRNZFaP3tliamX6nKO zrnmEmXfkanY2!>$HhKq{zcOS}!z=!N2H5c;{R~OH#}h@Ni0G_B>)nC!b3Ysw{6f)D z(ZfW+rWfOaP5oA`wz^)o1U!SdtBLoX)cqU!SZhVP9m&$Z>pm#+H+d=#G?6-Cc$PAP z^I!m+GtWn7nEb9z1%RPl<`bLxvNm}4RD02uig_^Uvkr#hRu5U=iDV@?x2T6IDG@r0 zX1@Bd%AX<=Ey=Oy!Gbug6i9CH9oe;Ps1*w3_-d!0fD z4#_DPJYs7ci<0fQ6v+|Ud^%V}NOv_05@lyyemHi%R{d{t=21JSU84?tfOspBH#efi0+%wP@<7!{{Tkzn^RO>IsUHV*aV7 zK2_?-kMn*4cK2yEmal)jYR`d#C*9cp`AEKH7QDZHnL*RJZ|!xh_P#D#yG_Xb@RWQ{ zQjOlB32AkQ$AmMQ*HH^%y=fwxI-e0LqfxF?n!!hLCgwch7o(Au_{PCF$By@=KmELq zQ)~qzXR>ou%PZpmo}_N*cgQERQ6;Qz_x=p{>oY5 zp7sRSr}3T&rLQ&oW{=W57-Z(%SUTXxIF7d;fjJFQVw#GDdG%dvPj*4cmo|CZwaVF*zdqq11AhQ8C zMvxPe*_WlVEbh(D@L$#yAFaa%$tL)ilWS$vwXOB=#rovLa0}^F>-P|Q5Wj~LCi0eKU^^0YwrXMU{MpKkp96jW$ZXQvHUwb|_xlcI`I?RuT zAJl1|yMRf+Y-Wuwzpn$hxMC+p#Sn5MEiUQjR5;F`d*%Aw!0!%1OwEd%j2Quh-v2C z@P@PXDt5r<;*^d=TR}|wR)DIzJ6v?eg6PNcXd>^{9naI-rpNp%0ErX%SDi|KTQwxh z>l+ilMK{aP^pisG4SN9jX&30naEEwHKST(bxot{Qz$Va=Fa{_{PGHhe3+%b0pyc=S~I=B<2OF7Z9U?yT;74G7GBe{aXs z8=f=x^xj$Y=DUE;(0baaH~D}UWxlq&nAS)aKUwcA>RvA*jrzk~A=f-~J;I(b=y8tIV6)iz<~Fu3sElLbeh0gPTAD6B8E8j?gqBg+W!?f8 z@>Q{aHh~L!o?h>ni0|T)gZeXeVK?IMq0R&w^$6h1Wh?lK9}CR-Qx3S471zDnWisY} zQ=d%o?}ADRS$SPHcVI$P4~}Qbn95jNLxkK6lPw>pq8mWp9TiYAUi~axF>lappn_F6 z&r~ZKd}q-(<(je9)2+za-z1%MZY9^e`D_*-p=26;iALNy!$l&B_Q$FvR!9yoo%FS$ z9isB-yc;brXY{#+1dmTJV2Z2Dts+XQqY=87cv6d6F(jppmx@7TreEFz_6%XKe7FGWW0x9BAO$MsLxbD|$=Sf@5s@ zih$r%1Y`agl$s5|Y%nwW#yqZujR~*|D0sNjYseyDgU`WHZgN^u&#-u&X?z9vv4`JSI2{aEQ?uRl|z0w4~edvH?Hxa1_E9ixRB zE}HOR6;PH=;6tSl@zwgk8w#&VJBp{Oen(C3rWp|YjULUGKBl$4o9U0C{!akl4B(by zxkAP>;|*FE`D0= z)Bq-bIn=x9Jb&VTc&(XhrFyl5m-S8-5jgNt0VFjqXR<35B6s&o|E zhZMSjvo80k>}LwNb&M>;SUV&0r0Z4LXj6KfbHB|f@?~cJxZ_{i>F*8WNhI(jiuXm* zK7m1&KatM|5A^y{0JuV;Z}>BuPyJ?4w;Ma?$nLWf`c{H`klg%}oho3x9|;iCwMqn8 z?_@ekK!_(W6WyV5j6ReoZ1?QhpGb)bN}Yvq`GfYc!Z|oGv$Gy&AhiO?yRnm%h_A5e z_7q96X0?56O*AhuSMl0WKPAX3>FDQ2{RQVH(Dkmqg#OTHT>Zm^GU|Yq0pCNE?z>ni zBXT3oH^vyNx_YnX-2Iw1;g#GLJXG}oXSR|M@x|5|=WCU{8ue~J0H7kSJDqs$urRw9 zVnPiZL=Rw(#bbY~zzFc;W1IU)I&FJ5Qn)eUtML^|?7=3G7MNdIw&))a0|1=G1y;P8 zHaKI_s^GUGfvd=0Y~z#A@;AWWEI?E7B9w^+z-<;QJr?yCSKLNIl0J-k#rabTk}=mH z-$plM2f9iOkH4wKr_}J|S?7m@9BUI)P5C`Oxrk5}xtxXId0p=rizfhMv*fI=OAZQ! zh~#AZ7kjV=J$Ia}-)FUUY2$89!1J#nOGE#Y=`f2GhnBa~i45-8pVunlAeylX#4;$p zJYu)7wo)}e8mwm;up8HN4FmleJk~d(8j56HeKUnV4Ir&(m;s+3i2POaYuR)F@#FFh z8lr#dH}Jpy^KaQ5lTV+&N}q;dkHVB$M>ZYZHCPo)vO(O&fwYZWbi=2hs7Uonr(m#AtxCB{yMG}o^7#o zpJ8(-FKKh28_HSar`5{CTUzpwgOi-Kul^fJlzzUDOtfM28(^mEvG#!IT%;+(}8`dP~Kak3eYhQ0LRQV{eop&KzJ4< zP5PR)BY~cbl1cb-n9I$GTQ;U3&YhwJd!FnQE@OBypJyzMad%sbF!2H3LLlXE61nBnYs(G4x@ zuK(vh|CYE8z}Y^AsEJkx;Y1%f8kwAiBsao{Wi|#73Um*jP0zUg3lz(CI-CG&cof#m zCD}&>?hTkf03MW!o*xNSi`-t#pr^{cjsf)h>f7~$($b0HSHU~#aYJeR`q+!#>$nN6 z1SD>7Jpv@J5N3m3mCe?0$xv5}{OLdmj0d@o!9BOT=kGw~3EO7-;6eMJIo6rw7{^Rt z6WqGZMYv}}Y~DoXW|EM_i6nip>JCG9GFP!HSLgnebLdy3T&~vvm9oJMhP0xOAS$jlH{?pDRJS^DxK}xqSar6~!CPTOd z6F#uzTQMiNi8>8sffod1-86i~{yO5N_k`!|XLbG48H!j)@5Ahj!Y4%O+S7P1jZ(}5 zJ9&Pr3+doG|8}JDcY{Nv)s4pr)k4_IkQomODVKscaN~y@J^05&a(h7~|JPt;i2k`e zHi5eIi>`D9UHY8Wn-D#WX^h-8P${EKbTLS@)KUp{G~*^UXVpMon8HUn1+;U@QIGCJ zLCA?SzH3BB&-=uYbn*nz8fY77;UUBi6T>No_Ili{K4$pR5o93qR+IUco2s~d3WvUU z_g!_8BiDJh;MK;_;ND{O^=qh82!>oEc2re^ZAr%s0&Zu4J+lh(b{KLmCedd6L^<6P}*NxZ|s0~G!_jAbC)6}EH~~+M+CSC2R}~4 zHfFkCSqHWw=yb(3qO7X3ITm(SwA52$)I%MG2!NXCvU6IAxN$Ydq{4EJK^bw#Ndz*r zyg9JZ#>>O5BodHR_lN?+ykIvjHFjCdzDhtIjV zrudxUngdB(5R%kKS$)cHY5;KRI{?0L4qC#uv{Mq~n36)-pipvs4Azo*GNLp3YL4Wi zz0>yWURIxZqIE-@?i*54PP3?*RE6{*8jSet!p%;f|HLxq1J~KepfK3eW6>}z)Koui zr_c;wJ4Um$-2jI3?X|_*fCo`Gme2ExMDBnD^|hj*4eG!R*3a0HchU@uxV}DJ1Mt`^ zE)JhSABiurC=U@`owW}DLnznU?;lx&$)-vd)V;IES}Xz=!S$jKuWz}n-M$HUm=uUA zoUo9UF>orK_uv(b0H8HPr^tR) zI;ditS_eLSJ*i&?x@2gZfHw5wc&KKmdiQx%hO#Hm9a4`N@ztdt7^@t zM#Tw;KY%Vbdz3cr1LD@8_~SylQ6MkJYFzcs9l=2x+zY{i0-0uDln(+i3p|^cT^~Sg zq7hOf#*YG)Tj;tjNB6U}AsgMs zjBPWRB96c4eR6XU9@e#b__BIgVq}L6Fx#{Lj?G|XO#T552(=B{ zLGBEx^*TG~Zg=mS`1*&*(`B=&>kd4@#oAsV3)m$QS^_KHjJh z8USZ`_ztpabL&?ANgsM#=gLe7j4xukbxw(v>GF49ZSG&~O~%dEUKbVJjJeUo6#CEs z|1-VOS?Q5&EvL?HH>7O$op=K?N%|3tf8#il01*}A-+Jr)UicEeVQM!43F(syh(?oDjz!*L7Wu%Pg2Abt$_{z z(e~>=v;lNX=0X6o&OwI|u%V}mo{^(t!r5VMS9V=V2DGtkZ{36>-@#oj@KO$6ZByiRuqKlvQh};+1?lq#e!$cjpJPOHxK$8=`Is{Ti-wn*&^!&cGFTszp z&!{M?-k9jE)gLB8}X?gnhRgMT5S z>mLx6S3pL6jp)@POnvtB!M~X4?tYY!Y@qAvjsnTm=dQ4|q2gsiDFAHC1njKa$Ju+pJIMCM-Zov*#(=0ts{8!3%)xfK(>u7!X^#MV`(2QCc18-764|;+@nn%UJV|9{LKb7D|iIoSn zWsU(TP`53Ot`XC(;%rSD3Qa&-rZ z8r0C8^%c}X*Qmb^R~iUFj7ATdLBDRo)aMUIpETOgYjFMnmci#5sWWiQ@SLp;FOkbme%$qbYs+|H zQD)pommN>E3O(xZ0(yJEyd8ze{5;Lhc`FlT^Te)ZBhx3hz z7^Bf-T?GOI`q3YVF6|GG1KOvA^MPexL=IH4>zvM>aj^F~{{hUIbKLG>+qm3217jJG zs;*TUrOa8>4fI7YDp~Oa-+=$;u8VFBux18xzj=Yp0iID%4T@x>5sDFol zLjzEOb-SCd4i`p`u-n7&!~Q|^RO7a%26UNR^h{s5Y9&H_;kJds@zvm8?2QSnq zd+XaoTMq-!J`lJr_nQ4~uM;o6{21#ixJaKTggnwB^6qXnsC)CrK1fhHoB4l$0Rli> z%jF|pwY(eD>w88LxybAgy=Xij^866F311_3&z7xOa!o4$cG-qCkwny@U5WW?_d905 z51`0R`+h=rXGV`Q1_nv(w50(67Nq(W8G)VkEcp;E-C70=bjkD#-z1o_3PsESpOxRVNu1>c zuz~X7>^lHN)s^^G!>!2+eaYBT^>x8JqP?UrAYzqg1#*idRlNcep$y!0pN^d zCkYklW`DBljCOkto(L*}i0DhfM^9zsM~QJt!Fb1}Ux@#v@a6l&RJ!~p_)!!*!KX3R zaK&%6kSWg2iV9I<8xbT(l4sWORjy4bZIcH9RmIDk!X0jJtGsnRVd6jJBTAdm;5xmg zX(gE4K~wxzzZb2K4czBSg-reEOk(b1jewr~KADlxg2YCCs~284Hw)_4u3!DF;@v z|0|@1yXx6U^>{bjgRfw-&eyFl?Q67enE+r!qrGo`!wZ(gd9gv$lEpgCGAUZ`3AfJ` z-nh33{+7Ze4npvhMk1L)=n~?T5wl&jrLRtSJC>Y7YNJATEsq$xX#d$-s zG(&BLo~;5E<)|k1JC=!AU4IK5p}Of*mw!|D%f|hkz>a%fiB=)<60f-&y1i7XEMDZz z@+3lWStkRs#P`Pfj^E~RG)#%4MNsC}{bBt;lnb%WbV}9vbTp-x&%)L-#uJ+5r!E)y z8OqP##;=8ad78nXcc~hdR~3Dud(-+xAeN2B371yD(m#KG^$lCr^=07CBG;68+h=3@ z06igFgky7f)ZRF4+_b~FRlAD^Ts`G?8ry%Ll(GDSb984S*?`ZG!7L^GcLV8VU{Y$M zexYmzcsiNp^71J|W1Xug{OqpOb=ceyDi^aw5^yqQhI(e-3i-$)h+O1%J7h3x=KG87l@IUN){KX``oap05b zMPd8y3jhEN4oO5oRE*I;6ew|t=JS@zJl{=OyrIw@FNi=e@)7YkzHigS8_fvZfhWHM zrW1jZ;oOWmadX|8a}d3A&F^?5qk^sY6OGN(<*Y1GL1RUC%_vI#zDUM{kKCDQ{cdbC zmQ6j1nHgQtoAfEjj+)4gouoGEUs)+S$p1Ed;+`f}Ge$cyxwfym7gdJqR2FtvSlue@ zWPDRm*yqDW7%)CzxjNJKaNCkg+}@1K{@Tyz9IUMw%YGxp2w0P+Y5!A_LzgNKC+V|Pny6|h=G);#$d|2X-;%3LtDY!=H{$J>b7&D3^muA<0yHpwS*|ezCYo(%R z`FF%+kX4*+)0_;K7PB7QND*rn~iH>@XD_va8VHoO)<`cQ4%j&2ffZXAn_vF>rh^b zX^-{K-W>dP+j1D4Ow04+-U9z@)$x|LoxTQo{5CKxnH;EXRZqO#b6>)25P9k;l<|t4 z_GXS%#vdX7zJJIQPf_K*S$6w7r{4#pkNSI@4kBL|3EXr%cg}ME-Dx-SOUb<#-dF4G9QAw} z=OfzY(}l?k#LV7I4V0mMPx7O^jL$3Go3^)MKc|DSRJ5p16GGvh<4+d2-6kyIXHsl7 zGrl%!HY&QZcf}m;F+8)5WMQ(*6YdU+E04nLo`>==>M=MV8Lilt&@ax~Aad&zeR8Lb z8cpHwi4^EdD4q4;ThDfLShiDqffF@ET7O2x%jBNe0LrA4tZSJX@E9yP4W5*|vJWso zas*5L8L;BJ&dF~~1qnOR{z~1|<==4a2gdu`(S~xS{WI(d2?Av-nvr^QtCYjga+MgMblZ3bfu2X(s{@CvD zc40zSmUku#|N7s5|Lp9vfyaOgsGglz&3wnEt#g!b z3f?s?jE5|GkMZ;$nsfTokyyP@n_d4crNH5rV#Ie0XZ1dQrC6}y)nfjP_K+?QeUnV5 z&#BJum%IoKJE;?mpQAGX=T@KdFWLXD0KY2_Ziy=s>R$FQVQ>b#(F>YIp|Suf(I<*~ zqvVDRJN_l?kmC90X}{+?4mcl_-5Bcfem1{}4YAj*$UnSJSmK9+`x)S^!sl%j7%5#Bi{*>A$crxI ziRa~30jY!Pes5YCgq?C#hv%Wac=XM5ja=6Dfei|~0p5!SHlc@OX_OlLF{marDf#(m)S3KA&a?Y<=+aFH) zRdH)0@(N$TRIf*7;Z6!uaH)j<`pMWB^?j-+=K7H*$|5tv+J4GSwb4SU$s6ohppUZr zNPlQQv2Cr1JPkJBfUdj8tbt(Cad zg$~FkgqGuy@XvMhO(^=)cd!d4tjOAVKFFo?F-XL3NzYcpCrWB3f0mcuvwxrg<*}T| z6M9bM`CH)c!zyC8-=x>zZ}O&NXhZ+Qw~AU8oLj3izKYQD$(*$*IF-jg(d@k=D`Sgu z2)M|fAOM-@fJ_IMQwhgR{ru{cMvPzroxGvUoIb1qDv){V6U^?t31hCxS7FOd{IWey z69Jj(iEl@I4#Tw18o<*iLW;KY!hN0I^SqPxLA4Q^16wTix#YmUCx50}2cNBV;ZLUc2-0A4V#&MN* zNzc4|c0IG7TamAymZ49A50xR`t*=DyP{&G9WR+nU{!kFFX{T1#F$`2dT@_;WOgiEe z_nb)5;D|Y;?5~vu1H19L_~%OBP&PA4oBTjp;%`cRubx#Y2E5Yi%{nEN&zy#|4&a~A z9|Hc8dzB3BTxS80m|tXne3$h9B>4M=cN6D-6>W%Ni(nmIi4NEIPV4(5|C{l4TA#|xY55GVAb~5qlh&7jfT}($H-G~`&L}`jnnI}Fy_!1fPq_~u5xF%0TvddT zxS)(v0SHlmm|s3nDm&$;ku!`OQs=8qo=?~O4Yb4v+AIXe(7&uBTg)j4orNePU9--< zi6Eb(-4NvmY}t;)GlB^w+pwX4uUkpo4!>DyRu6&46wo%0$HFgqmS41*{uvu?2#~!x-QZx zfQa>7nL9A7af4@>E9}k&*78Xima~q#I^yr-+I>BrgyQTB?^ZWweah%28rJ+#!*<;NhbOR z8DB|dh<1@;L~bYV?EcK--K9I5gB259sNxOdK2JE_j=UFO?zaZe3K?2PYj$+d+bGQ! z9lK*5#1L1M!OSX$x-zn3lyJC;htsREVIm{H?*ll@ zi-6n*2hpB03G1<4(j$q;L|4!^RC*dod+7N@fcOoxU6tQK;sd?(GkS0p`T7wj{TF%q zJG9dW{acd#)6tz@nO2M-Iuq>7Q{SzBldPTRzltS)skDlqL}m69k-48_>_L04NlW=D zlT6{cU=Ft5v6kJJGu1Pq)XbJsmtI`|c&ZGW5;wepqqSlDDt*vEHoqEq90yPHpBfsg zr&lzCPIPJX+Pc=K?wI&1e7s04Q`tSaf7zbY(hpX>Db5 xbYX3905UK#H7zhREiy4wF*7z9msE6GHor*4 zNG(O0{W=iJOrkqOb9_`R{`NB?CEKvej8tPe@;{=086RBwwRAz|rO{Y~i!tr7qC#pL|dpn^8@ z=E4o9u_J8HOQu0RINzu1NVG2e*_bj#vGs<5Ji1V+bv%n$$2r6O?;IM7 zw*Q3*VRuK0V#m+Tx9{VG?}ga#kv!M9^RCx?4ick6W-60zS2RTP2wdBG#oeCqZM0JK z<{ujj3vT=w!HKue>)}O*-0#k}-R)fWxZJpQIo;ew*8a_#>o*QOi@HbM-13<1r1B}L z4$X?+H{v`ci{JQ!cf;1cN^BZ;ckdH}1@|5GmkS@XRGi5)CKNw&jAab@z8d=dU`NK( zZ-xJC7s;(MKBhEnbsLGESUTO|`_rGxqWfR8s2aLxo&CD{5<$bHQTG*(xnrnCrNXu8 z#oQ*96$>eN)4jh5-O0S9XsT5C^4dLo=B7Ot&)h|Ausf=%D{AtuYC6r-U@QJm9dx=3 zCik{B&N#_QO2!LqaF&zu6jwXP{JqHu?HQ^LuLRt#$qIh(IW9s+R~(2~$whiI7rt{2 zz#0V$E@w~DnEM^1_;u6*s1dcCJ4O@zl`2_!;>$*gv)lwGa-#G%6O`>iYNJ-GUZtM| z|EyMlf|I4Ij2hMrGxfq=ir<*si9{=(pAzq7qS9Up@((o|wj~G3N7mpjbRY%hXxMlN zA@2xPDLKUOp$W0`uGpR|9p*;9@~SQiTOtP84I=Eaz9JEGaOF<$>oxd`_x;NmF5OY+`C%)+mL;1LWK;8h7XY~k*RIy$#amz}m-bt1hQ`WLy2KFl zo`Iw@P%D89gFc|VQA$_3LKs5@ne#SCwbE83%uT~Yiv{2!A`E}^-f_FGspQecZ*`#8 z)#G_Lf;|sCU2VV+gf{ivzxeYa892u2_0!#cWr*+-Ke>Sn5t^l(`Ze{NMHumYEg!(@ zDA>kjqW3@AADwENJc)#9SteZXFVRBUZNN~=(qm}ByU$OF{u*KocW}RfF+W#wD2)P! zw}KG|eUYX_VU`0D3M>SWWSg-*7p8e89|U%*!5ukzPhg3g0a>8}KA>US3EB2a>_k~X z2fot64sE0@+a}WgpiygrTUJ%A(eBBop^$){4P_SkKXawIqhwo z@ro4>KfdUYq-SjXYqtfmMEBlG)l?CmhFOTjw)29Ypwn*6%n z4&Nw#d5#4zSQRmobM{=^hb*ue2HQy4#x_J2+3q}!L;(Cf3kM#Ya*x8NqM%)d_xZ-9 zReykzr@N0~ZX|mveM5Z;(??B@`Dg~2ezpWjU5PnSQ26k)yCr^D$4xt5OK=VavvPdV zn$Rc{S1eihh{Zt2Oo6Q{NX5rpz1om;Ng$$k)^Wh-1or5Q7^N!MbLrS5KA*N zU|7}@&7f$ln?OCv<>u~LI7`$cBqF~KEEI>2f~RtImG3NQA0E0z;$fQkoWrSry{wM0 zK^m*3T8qo^(?SG*M1Fh^uoxjl^c@KI^$xi$Y!GQ0`1$M4f$AG!9ak9 z1vVL)P!d9y6RE~4_Fa&mL{4RYoI5FxZpeE7Z~q|NEscE`9<>t0NOT${N|flqx@V)_ zCNjx^7Hot*Uzm3xEHDViUh)jNH-}nds{G0nf}AAv96=i0NC8-{b@zmQ@AQwlg3+RB z*Iy{8wd_;(bW@?P`plN@iT*d1Y@~f*jF#9#^n&yLCi>j)^+X}0HGi!d%An`#iM*c- z^oD!Y+n9`aFRaA}S}%7&R^9G+S3B`6xw$H)`bfd1?sVsb8I{P5wHLQaL7AP@-oDdi z^xCSP9b3{SE6&$@Zcgv#=3It2<%b)EwWG<|K4j_G)x^1(8C!KMi7QW>d${GP+Eg}j zyyx<9gM3HZrYUzj)_>F&ynnaKY4YjD;jY!=Ktjh d5l*yAg==Q5+oTg*Q}#I_`FaL;)Cfgc{{^bg+hqU% diff --git a/cmd/jws/main.go b/cmd/jws/main.go index e3fcdf0..7a48054 100644 --- a/cmd/jws/main.go +++ b/cmd/jws/main.go @@ -1,4 +1,3 @@ -// cmd/jws/main.go package main import ( @@ -16,8 +15,10 @@ import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" + "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" ) //go:embed all:projects @@ -47,19 +48,56 @@ func main() { os.Exit(1) } - logger.Logger.Info("Applikation started") + logger.Logger.Info("Application started") a := app.New() + + showSplashScreen(a, func() { + createMainWindow(a, config) + }) + + a.Run() +} + +func showSplashScreen(a fyne.App, onComplete func()) { + splash := a.NewWindow("Important Information") + splash.SetFixedSize(true) + splash.CenterOnScreen() + splash.SetPadded(true) + + title := widget.NewLabel("JakartaEE & Spring Boot Starter") + title.TextStyle = fyne.TextStyle{Bold: true} + title.Alignment = fyne.TextAlignCenter + + infoText := widget.NewLabel("Please note:\n\n" + + "• On Windows, a functional Winget installation is required.\n" + + "• Administrator rights may be needed at some points.\n\n" + + "Click 'Continue' when you're ready to proceed.") + infoText.Wrapping = fyne.TextWrapWord + + continueButton := widget.NewButton("Continue", func() { + splash.Close() + onComplete() + }) + + content := container.NewVBox( + title, + infoText, + continueButton, + ) + + splash.SetContent(content) + splash.Show() +} + +func createMainWindow(a fyne.App, config *config.Config) { mainWindow = a.NewWindow("JakartaEE & Spring Boot Starter") mainWindow.Resize(fyne.NewSize(600, 600)) - // mainWindow.SetFixedSize(true) - // Initialize dependencies dependencies = []dependency.Dependency{ {Name: "Visual Studio Code", Installed: false, Icon: theme.DocumentIcon()}, {Name: "Docker", Installed: false, Icon: theme.MediaPlayIcon()}, } - // Standard projects standartProjects := []project.Project{ { Name: "JakartaEE Todo-App mit Servlet", @@ -83,7 +121,6 @@ func main() { }, } - // Load additional projects from projects.json pluginProjects, err := loadProjects(filepath.Join(config.ProjectsPath, "projects.json")) if err != nil { dialog.ShowError(fmt.Errorf("error loading projects: %v", err), mainWindow) @@ -92,11 +129,9 @@ func main() { projects = append(standartProjects, pluginProjects...) - // Initialize packages gui.Init(mainWindow, dependencies, projects, projectsFS) project.Init(projects, config) - // Check dependencies dependency.CheckDependencies(dependencies) allInstalled := true for _, dep := range dependencies { @@ -106,14 +141,13 @@ func main() { } } - // Show appropriate screen if allInstalled { gui.ShowProjectScreen() } else { gui.ShowDependencyScreen() } - mainWindow.ShowAndRun() + mainWindow.Show() } func loadProjects(filePath string) ([]project.Project, error) { diff --git a/internal/dependency/dependency.go b/internal/dependency/dependency.go index 95516c8..c6d43ed 100644 --- a/internal/dependency/dependency.go +++ b/internal/dependency/dependency.go @@ -126,7 +126,7 @@ func installWindowsDependencies(index int, cmd *exec.Cmd, mainWindow *fyne.Windo switch index { case 0: // VSCode cmd = tools.CommandInShell("winget", "install", "-e", "--id", - "Microsoft.VisualStudioCode") + "Microsoft.VisualStudioCode", "--accept-package-agreements", "--accept-source-agreements", "--silent") case 1: // Docker Desktop wslCheckCmd := tools.CommandInShell("wsl", "--status") err := wslCheckCmd.Run() @@ -154,7 +154,7 @@ func installWindowsDependencies(index int, cmd *exec.Cmd, mainWindow *fyne.Windo return nil, err } cmd = tools.CommandInShell("winget", "install", "-e", "--id", - "Docker.DockerDesktop") + "Docker.DockerDesktop", "--accept-package-agreements", "--accept-source-agreements", "--silent") } return cmd, nil } From a03f180e43dd4a8ef22d884466a1748da1658f2a Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Fri, 21 Mar 2025 20:43:41 +0100 Subject: [PATCH 12/38] feat: Add complete example for Jakarta Faces and a devcontainer setup --- Icon.png | Bin 2375 -> 265627 bytes cmd/jws/main.go | 6 +- .../.devcontainer/.dockerignore | 8 + .../.devcontainer/.gitignore | 27 ++ .../.devcontainer/Dockerfile | 12 + .../.devcontainer/Dockerfile.dev | 14 + .../.devcontainer/devcontainer.json | 14 + .../.devcontainer/docker-compose.yml | 60 +++++ .../jakarta-faces-todo/.devcontainer/init.sql | 17 ++ cmd/jws/projects/jakarta-faces-todo/pom.xml | 87 +++++++ .../projects/jakarta-faces-todo/server.xml | 34 +++ .../main/java/com/todoapp/bean/AuthBean.java | 133 ++++++++++ .../main/java/com/todoapp/bean/TodoBean.java | 112 ++++++++ .../main/java/com/todoapp/bean/UserBean.java | 43 +++ .../main/java/com/todoapp/dao/TodoDAO.java | 134 ++++++++++ .../main/java/com/todoapp/dao/UserDAO.java | 136 ++++++++++ .../src/main/java/com/todoapp/model/Todo.java | 110 ++++++++ .../src/main/java/com/todoapp/model/User.java | 98 +++++++ .../java/com/todoapp/util/AuthFilter.java | 44 ++++ .../java/com/todoapp/util/HibernateUtil.java | 109 ++++++++ .../src/main/liberty/config/server.xml | 34 +++ .../main/resources/META-INF/persistence.xml | 20 ++ .../src/main/resources/hibernate.cfg.xml | 26 ++ .../src/main/webapp/WEB-INF/faces-config.xml | 7 + .../src/main/webapp/WEB-INF/web.xml | 43 +++ .../src/main/webapp/error.xhtml | 24 ++ .../src/main/webapp/login.xhtml | 35 +++ .../src/main/webapp/register.xhtml | 45 ++++ .../src/main/webapp/resources/css/style.css | 246 ++++++++++++++++++ .../src/main/webapp/todo-form.xhtml | 46 ++++ .../src/main/webapp/todo-list.xhtml | 70 +++++ .../.devcontainer/Dockerfile | 18 -- .../.devcontainer/devcontainer.json | 9 - .../.devcontainer/docker-compose.yml | 32 --- cmd/jws/projects/jakarta-servlet-todo/pom.xml | 49 ---- .../main/java/com/example/dao/TodoDAO.java | 36 --- .../src/main/java/com/example/model/Todo.java | 43 --- .../java/com/example/servlet/TodoServlet.java | 40 --- .../main/resources/META-INF/persistence.xml | 19 -- .../src/main/webapp/WEB-INF/web.xml | 9 - .../src/main/webapp/index.jsp | 36 --- .../target/classes/META-INF/persistence.xml | 0 .../classes/com/example/dao/TodoDAO.class | Bin 1566 -> 0 bytes .../classes/com/example/model/Todo.class | Bin 1333 -> 0 bytes .../com/example/servlet/TodoServlet.class | Bin 2614 -> 0 bytes 45 files changed, 1791 insertions(+), 294 deletions(-) create mode 100644 cmd/jws/projects/jakarta-faces-todo/.devcontainer/.dockerignore create mode 100644 cmd/jws/projects/jakarta-faces-todo/.devcontainer/.gitignore create mode 100644 cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile create mode 100644 cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile.dev create mode 100644 cmd/jws/projects/jakarta-faces-todo/.devcontainer/devcontainer.json create mode 100644 cmd/jws/projects/jakarta-faces-todo/.devcontainer/docker-compose.yml create mode 100644 cmd/jws/projects/jakarta-faces-todo/.devcontainer/init.sql create mode 100644 cmd/jws/projects/jakarta-faces-todo/pom.xml create mode 100644 cmd/jws/projects/jakarta-faces-todo/server.xml create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/AuthBean.java create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/TodoBean.java create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/bean/UserBean.java create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/dao/TodoDAO.java create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/dao/UserDAO.java create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/model/Todo.java create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/model/User.java create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/util/AuthFilter.java create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/java/com/todoapp/util/HibernateUtil.java create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/liberty/config/server.xml create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/resources/META-INF/persistence.xml create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/resources/hibernate.cfg.xml create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/webapp/WEB-INF/faces-config.xml create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/webapp/WEB-INF/web.xml create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/webapp/error.xhtml create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/webapp/login.xhtml create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/webapp/register.xhtml create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/webapp/resources/css/style.css create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/webapp/todo-form.xhtml create mode 100644 cmd/jws/projects/jakarta-faces-todo/src/main/webapp/todo-list.xhtml delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/.devcontainer/Dockerfile delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/.devcontainer/devcontainer.json delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/.devcontainer/docker-compose.yml delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/pom.xml delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/dao/TodoDAO.java delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/model/Todo.java delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/src/main/java/com/example/servlet/TodoServlet.java delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/src/main/resources/META-INF/persistence.xml delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/src/main/webapp/WEB-INF/web.xml delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/src/main/webapp/index.jsp delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/target/classes/META-INF/persistence.xml delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/dao/TodoDAO.class delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/model/Todo.class delete mode 100644 cmd/jws/projects/jakarta-servlet-todo/target/classes/com/example/servlet/TodoServlet.class diff --git a/Icon.png b/Icon.png index b9c666c8b562ce1ed8dc2a5dcaaded184093088a..b978900168d1911b38e9e87ab757264c5201159f 100644 GIT binary patch literal 265627 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

diff --git a/cmd/jws/projects/jakarta-jsp-todo/pom.xml b/cmd/jws/projects/jakarta-jsp-todo/pom.xml index a2162c8..2ada600 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/pom.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/pom.xml @@ -14,7 +14,7 @@ 17 17 10.0.0 - 6.2.5.Final + 6.6.17.Final 42.6.0 diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index e28cb25..f8e480a 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -14,7 +14,7 @@ 17 17 10.0.0 - 6.2.5.Final + 6.6.17.Final 42.6.0 From 822c137eab8e4abb8dd3a2e0aceb2abbcbeb8fea Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 5 Jun 2025 10:52:38 +0000 Subject: [PATCH 34/38] chore(deps): update dependency org.postgresql:postgresql to v42.7.6 --- cmd/jws/projects/jakarta-faces-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-jsp-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-rest-todo/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/jws/projects/jakarta-faces-todo/pom.xml b/cmd/jws/projects/jakarta-faces-todo/pom.xml index ef88ed3..cb099b6 100644 --- a/cmd/jws/projects/jakarta-faces-todo/pom.xml +++ b/cmd/jws/projects/jakarta-faces-todo/pom.xml @@ -15,7 +15,7 @@ 17 10.0.0 6.6.17.Final - 42.6.0 + 42.7.6 diff --git a/cmd/jws/projects/jakarta-jsp-todo/pom.xml b/cmd/jws/projects/jakarta-jsp-todo/pom.xml index 8a8290a..3e91660 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/pom.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/pom.xml @@ -15,7 +15,7 @@ 17 10.0.0 6.6.17.Final - 42.6.0 + 42.7.6 diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index a9b8e96..9a9987c 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -15,7 +15,7 @@ 17 10.0.0 6.6.17.Final - 42.6.0 + 42.7.6 From 2c09fd84b1df83b53570f8e1b12b5e2e5f892ac1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 5 Jun 2025 13:58:38 +0000 Subject: [PATCH 35/38] chore(deps): update module fyne.io/tools to v1.6.1 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 1731e4f..36908b5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.23.5 require ( fyne.io/fyne/v2 v2.6.1 - fyne.io/tools v1.0.0-alpha1 + fyne.io/tools v1.6.1 github.com/spf13/viper v1.20.1 ) diff --git a/go.sum b/go.sum index 2347c75..f47153e 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ fyne.io/systray v1.11.0 h1:D9HISlxSkx+jHSniMBR6fCFOUjk1x/OOOJLa9lJYAKg= fyne.io/systray v1.11.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= fyne.io/tools v1.0.0-alpha1 h1:350eF+LVPbIHNgYPCoP04yCsQSFQ3aupATx33ClZjZk= fyne.io/tools v1.0.0-alpha1/go.mod h1:7gcHTl85tD/yLcGcU2bJGECAwSVAWrr99Ngmgrz/s54= +fyne.io/tools v1.6.1 h1:X4DmDcuFUV+g2cM8AGtNQSmLN0yqYKSiJ2Z3zPfofBA= +fyne.io/tools v1.6.1/go.mod h1:rzfZnWA1jZb/0IbYlBYHXhzH0povDGP8Psqfv7VsOYw= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 851e863d852a51e9af03f84c7ff0e8e667d24552 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 5 Jun 2025 15:00:16 +0000 Subject: [PATCH 36/38] chore(deps): update icr.io/appcafe/open-liberty docker tag to v25 --- cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile | 2 +- cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile | 2 +- cmd/jws/projects/jakarta-rest-todo/.devcontainer/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile index e9d615d..d09e6f2 100644 --- a/cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile +++ b/cmd/jws/projects/jakarta-faces-todo/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi +FROM icr.io/appcafe/open-liberty:25.0.0.5-kernel-slim-java17-openj9-ubi COPY --chown=1001:0 src/main/liberty/config /config # # Verzeichnis erstellen und PostgreSQL JDBC-Treiber herunterladen diff --git a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile index e9d615d..d09e6f2 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile +++ b/cmd/jws/projects/jakarta-jsp-todo/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi +FROM icr.io/appcafe/open-liberty:25.0.0.5-kernel-slim-java17-openj9-ubi COPY --chown=1001:0 src/main/liberty/config /config # # Verzeichnis erstellen und PostgreSQL JDBC-Treiber herunterladen diff --git a/cmd/jws/projects/jakarta-rest-todo/.devcontainer/Dockerfile b/cmd/jws/projects/jakarta-rest-todo/.devcontainer/Dockerfile index e9d615d..d09e6f2 100644 --- a/cmd/jws/projects/jakarta-rest-todo/.devcontainer/Dockerfile +++ b/cmd/jws/projects/jakarta-rest-todo/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM icr.io/appcafe/open-liberty:23.0.0.4-kernel-slim-java17-openj9-ubi +FROM icr.io/appcafe/open-liberty:25.0.0.5-kernel-slim-java17-openj9-ubi COPY --chown=1001:0 src/main/liberty/config /config # # Verzeichnis erstellen und PostgreSQL JDBC-Treiber herunterladen From 719ae05a3a3968ea1a81587cf39da0bb9cc3d9cf Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 25 Jul 2025 07:30:29 +0000 Subject: [PATCH 37/38] chore(deps): update dependency io.openliberty.tools:liberty-maven-plugin to v3.11.4 --- cmd/jws/projects/jakarta-faces-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-jsp-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-rest-todo/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/jws/projects/jakarta-faces-todo/pom.xml b/cmd/jws/projects/jakarta-faces-todo/pom.xml index cb099b6..ad80487 100644 --- a/cmd/jws/projects/jakarta-faces-todo/pom.xml +++ b/cmd/jws/projects/jakarta-faces-todo/pom.xml @@ -80,7 +80,7 @@ io.openliberty.tools liberty-maven-plugin - 3.11.3 + 3.11.4 diff --git a/cmd/jws/projects/jakarta-jsp-todo/pom.xml b/cmd/jws/projects/jakarta-jsp-todo/pom.xml index 3e91660..af79c3b 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/pom.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/pom.xml @@ -82,7 +82,7 @@ io.openliberty.tools liberty-maven-plugin - 3.11.3 + 3.11.4 diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index 9a9987c..be14d19 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -105,7 +105,7 @@ io.openliberty.tools liberty-maven-plugin - 3.11.3 + 3.11.4 From 3082aef1e8ea572f96f946c3e15feaf922c30b4b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 25 Jul 2025 07:30:32 +0000 Subject: [PATCH 38/38] chore(deps): update dependency org.hibernate.orm:hibernate-core to v6.6.22.final --- cmd/jws/projects/jakarta-faces-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-jsp-todo/pom.xml | 2 +- cmd/jws/projects/jakarta-rest-todo/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/jws/projects/jakarta-faces-todo/pom.xml b/cmd/jws/projects/jakarta-faces-todo/pom.xml index ad80487..d7f9f9d 100644 --- a/cmd/jws/projects/jakarta-faces-todo/pom.xml +++ b/cmd/jws/projects/jakarta-faces-todo/pom.xml @@ -14,7 +14,7 @@ 17 17 10.0.0 - 6.6.17.Final + 6.6.22.Final 42.7.6 diff --git a/cmd/jws/projects/jakarta-jsp-todo/pom.xml b/cmd/jws/projects/jakarta-jsp-todo/pom.xml index af79c3b..b4a19fb 100644 --- a/cmd/jws/projects/jakarta-jsp-todo/pom.xml +++ b/cmd/jws/projects/jakarta-jsp-todo/pom.xml @@ -14,7 +14,7 @@ 17 17 10.0.0 - 6.6.17.Final + 6.6.22.Final 42.7.6 diff --git a/cmd/jws/projects/jakarta-rest-todo/pom.xml b/cmd/jws/projects/jakarta-rest-todo/pom.xml index be14d19..abcac9c 100644 --- a/cmd/jws/projects/jakarta-rest-todo/pom.xml +++ b/cmd/jws/projects/jakarta-rest-todo/pom.xml @@ -14,7 +14,7 @@ 17 17 10.0.0 - 6.6.17.Final + 6.6.22.Final 42.7.6