feat: initial project commit

commit to push first working snapshot to codeberg
This commit is contained in:
Patryk Hegenberg 2025-03-15 00:13:20 +01:00
commit 09b1054588
25 changed files with 1405 additions and 0 deletions

2
cmd/jws/FyneApp.toml Normal file
View file

@ -0,0 +1,2 @@
[Details]
Build = 4

BIN
cmd/jws/Icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

113
cmd/jws/main.go Normal file
View file

@ -0,0 +1,113 @@
// cmd/jws/main.go
package main
import (
"embed"
"encoding/json"
"fmt"
"jws/internal/dependency"
"jws/internal/gui"
"jws/internal/project"
"os"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/theme"
)
//go:embed all:projects
var projectsFS embed.FS
var (
dependencies []dependency.Dependency
projects []project.Project
mainWindow fyne.Window
)
func main() {
a := app.New()
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",
Description: "Eine Todo-Anwendung mit Jakarta Servlet und\nPostgreSQL-Datenbank.",
FolderName: "jakarta-servlet-todo",
},
{
Name: "JakartaEE Todo-App mit JSP",
Description: "Eine Todo-Anwendung mit Jakarta Server Pages und PostgreSQL-Datenbank.",
FolderName: "jakarta-jsp-todo",
},
{
Name: "JakartaEE Todo-App als REST-API",
Description: "Eine Todo-Anwendung als REST-API mit JakartaEE und PostgreSQL-Datenbank.",
FolderName: "jakarta-rest-todo",
},
{
Name: "Spring Boot Todo-App als Microservice",
Description: "Eine Todo-Anwendung als Microservice mit Spring Boot und PostgreSQL-Datenbank.",
FolderName: "spring-boot-todo",
},
}
// Load additional projects from projects.json
pluginProjects, err := loadProjects("projects.json")
if err != nil {
dialog.ShowError(fmt.Errorf("error loading projects: %v", err), mainWindow)
return
}
projects = append(standartProjects, pluginProjects...)
// Initialize GUI package
gui.Init(mainWindow, dependencies, projects, projectsFS)
// Check dependencies
dependency.CheckDependencies(dependencies)
allInstalled := true
for _, dep := range dependencies {
if !dep.Installed {
allInstalled = false
break
}
}
// Show appropriate screen
if allInstalled {
gui.ShowProjectScreen()
} else {
gui.ShowDependencyScreen()
}
mainWindow.ShowAndRun()
}
func loadProjects(filePath string) ([]project.Project, error) {
file, err := os.Open(filePath)
if err != nil {
if os.IsNotExist(err) {
return []project.Project{}, nil
}
return nil, fmt.Errorf("error opening JSON-file: %v", err)
}
defer file.Close()
var projects []project.Project
decoder := json.NewDecoder(file)
if err := decoder.Decode(&projects); err != nil {
return nil, fmt.Errorf("error decoding JSON-file: %v", err)
}
return projects, nil
}

View file

@ -0,0 +1,18 @@
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"]

View file

@ -0,0 +1,9 @@
{
"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"
}

View file

@ -0,0 +1,32 @@
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

View file

@ -0,0 +1,49 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>jakarta-servlet-todo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<jakartaee.version>10.0.0</jakartaee.version>
<hibernate.version>6.0.0.Final</hibernate.version>
<postgresql.version>42.3.1</postgresql.version>
</properties>
<dependencies>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>${jakartaee.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,36 @@
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<Todo> 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);
}
}
}

View file

@ -0,0 +1,43 @@
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;
}
}

View file

@ -0,0 +1,40 @@
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<Todo> 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");
}
}

View file

@ -0,0 +1,19 @@
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
version="3.0">
<persistence-unit name="todoPU">
<class>com.example.model.Todo</class>
<properties>
<property name="jakarta.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:postgresql://db:5432/tododb"/>
<property name="jakarta.persistence.jdbc.user" value="todouser"/>
<property name="jakarta.persistence.jdbc.password" value="todopass"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>

View file

@ -0,0 +1,9 @@
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>JakartaEE Todo App</display-name>
</web-app>