diff --git a/.claude/settings.local.json b/.claude/settings.local.json index d402016..3d19afa 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -13,7 +13,15 @@ "Read(//tmp/**)", "Bash(cd:*)", "Bash(JAVA_HOME=\"/snap/eclipse/132/usr/lib/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_21.0.10.v20260205-0638/jre\"; JAVA_HOME=\"$JAVA_HOME\" PATH=\"$JAVA_HOME/bin:$PATH\" ./gradlew compileJava 2>&1 | grep -E \"error:|ERROR|warning:|WARN|BUILD\" | head -30)", - "Bash(JAVA_HOME=\"/snap/eclipse/132/usr/lib/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_21.0.10.v20260205-0638/jre\" PATH=\"$JAVA_HOME/bin:$PATH\" ./gradlew compileJava 2>&1 | grep -E \"error:|BUILD\" | head -30)" + "Bash(JAVA_HOME=\"/snap/eclipse/132/usr/lib/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_21.0.10.v20260205-0638/jre\" PATH=\"$JAVA_HOME/bin:$PATH\" ./gradlew compileJava 2>&1 | grep -E \"error:|BUILD\" | head -30)", + "Bash(./gradlew compileJava -q 2>&1 | tail -5)", + "Bash(./gradlew compileJava -q 2>&1 | tail -20)", + "Bash(./gradlew compileJava -q 2>&1 | tail -10)", + "Bash(./gradlew compileJava 2>&1 | tail -10)", + "Bash(./gradlew compileJava 2>&1 | tail -20)", + "Bash(./gradlew compileJava 2>&1 | tail -15)", + "Bash(./gradlew compileJava -q 2>&1 | tail -30)", + "Bash(ls -lah /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/*.java)" ] } } diff --git a/.metadata/.lock_info b/.metadata/.lock_info index 6b8b190..35da6c3 100644 --- a/.metadata/.lock_info +++ b/.metadata/.lock_info @@ -1,5 +1,5 @@ -#Mon Mar 16 20:07:41 CET 2026 +#Tue Mar 17 19:49:49 CET 2026 display=\:0 host=Mario-Linux -process-id=73435 +process-id=140659 user=mario diff --git a/.metadata/.log b/.metadata/.log index 1f5a2fd..d78e8a1 100644 --- a/.metadata/.log +++ b/.metadata/.log @@ -6537,3 +6537,2758 @@ java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plu at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.springframework.tooling.boot.ls 1 0 2026-03-16 23:17:56.600 +!MESSAGE DelegatingStreamConnectionProvider - Stopping Boot LS + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-16 23:17:57.460 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) +!SESSION 2026-03-17 07:10:09.898 ----------------------------------------------- +eclipse.buildId=4.39.0.20260305-0817 +java.version=21.0.10 +java.vendor=Eclipse Adoptium +BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=de_DE +Framework arguments: -product org.eclipse.epp.package.java.product +Command-line arguments: -os linux -ws gtk -arch x86_64 -product org.eclipse.epp.package.java.product + +!ENTRY ch.qos.logback.classic 1 0 2026-03-17 07:10:14.650 +!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized. + +!ENTRY ch.qos.logback.classic 1 0 2026-03-17 07:10:20.614 +!MESSAGE Logback config file: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.101.20251017-1242.xml + +!ENTRY org.eclipse.ui 2 0 2026-03-17 07:10:20.801 +!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points. +!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-17 07:10:20.801 +!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory' + +!ENTRY org.eclipse.ui 2 0 2026-03-17 07:10:20.950 +!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points. +!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-17 07:10:20.950 +!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory' + +!ENTRY org.springframework.tooling.ls.eclipse.commons 1 0 2026-03-17 07:10:26.335 +!MESSAGE executing callback sts4.classpath.macjOuET FAILED + +!ENTRY org.springframework.tooling.ls.eclipse.commons 4 0 2026-03-17 07:10:26.335 +!MESSAGE org.eclipse.lsp4j.jsonrpc.ResponseErrorException: Internal error. +!STACK 0 +java.util.concurrent.ExecutionException: org.eclipse.lsp4j.jsonrpc.ResponseErrorException: Internal error. + at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396) + at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2096) + at org.springframework.tooling.ls.eclipse.commons.LSP4ECommandExecutor.executeClientCommand(LSP4ECommandExecutor.java:31) + at org.springframework.tooling.jdt.ls.commons.classpath.SendClasspathNotificationsJob.flush(SendClasspathNotificationsJob.java:178) + at org.springframework.tooling.jdt.ls.commons.classpath.SendClasspathNotificationsJob.run(SendClasspathNotificationsJob.java:149) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) +Caused by: org.eclipse.lsp4j.jsonrpc.ResponseErrorException: Internal error. + at org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.handleResponse(RemoteEndpoint.java:214) + at org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.consume(RemoteEndpoint.java:198) + at org.eclipse.lsp4e.LanguageServerWrapper.lambda$3(LanguageServerWrapper.java:449) + at org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.handleMessage(StreamMessageProducer.java:189) + at org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.listen(StreamMessageProducer.java:97) + at org.eclipse.lsp4j.jsonrpc.json.ConcurrentMessageProcessor.run(ConcurrentMessageProcessor.java:97) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 07:47:35.882 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 08:41:26.000 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 08:41:41.306 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 08:43:38.758 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:40:30.880 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 10:40:48.448 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:41:05.235 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:41:21.527 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 10:41:39.357 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:41:47.989 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:41:57.484 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:42:00.456 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:42:03.427 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:42:06.264 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:42:09.481 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:42:12.628 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:42:15.376 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:42:18.293 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:42:21.397 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 10:56:26.459 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 11:00:29.075 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 11:22:31.527 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 11:22:54.988 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 11:51:38.196 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.debug.core 4 125 2026-03-17 11:51:51.629 +!MESSAGE Error logged from Debug Core: +!STACK 0 +java.io.IOException: Stream closed + at java.base/java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:188) + at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:343) + at java.base/java.io.BufferedInputStream.implRead(BufferedInputStream.java:420) + at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:405) + at java.base/java.io.FilterInputStream.read(FilterInputStream.java:95) + at org.eclipse.debug.internal.core.OutputStreamMonitor.internalRead(OutputStreamMonitor.java:235) + at org.eclipse.debug.internal.core.OutputStreamMonitor.read(OutputStreamMonitor.java:211) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 12:25:53.653 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 12:34:49.505 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 12:42:16.053 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 13:51:48.224 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 13:57:07.538 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jface 2 0 2026-03-17 14:17:04.023 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2026-03-17 14:17:04.023 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.jdt.ui.navigate.open.type,Open Type, + Open a type in a Java editor, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + WorkbenchHandlerServiceHandler("org.eclipse.jdt.ui.navigate.open.type"), + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.ui.contexts.window,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.lsp4e.symbolInWorkspace,Go to Symbol in Workspace, + , + Category(org.eclipse.lsp4e.category,Language Servers,null,true), + WorkbenchHandlerServiceHandler("org.eclipse.lsp4e.symbolInWorkspace"), + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.ui.contexts.window,,,system) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 14:18:37.529 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 14:18:46.125 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 15:12:51.122 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 15:36:01.075 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 15:58:26.770 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 16:10:09.728 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 17:18:34.934 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 17:24:10.427 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 17:44:25.859 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 17:44:47.695 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 18:31:31.618 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 19:13:18.996 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 19:13:20.459 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 19:18:35.941 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 19:26:02.385 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 19:32:09.673 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:33:38.138 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:33:43.991 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:468) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu.gtk_show(Menu.java:854) + at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:2600) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:6146) + at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_iteration_do(Native Method) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4494) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 41 more + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:34:01.057 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:34:05.710 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:468) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu.gtk_show(Menu.java:854) + at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:2600) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:6146) + at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_iteration_do(Native Method) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4494) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 41 more + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:34:28.524 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:35:01.524 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:36:27.987 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.springframework.tooling.boot.ls 1 0 2026-03-17 19:37:21.170 +!MESSAGE DelegatingStreamConnectionProvider - Stopping Boot LS + +!ENTRY org.springframework.tooling.ls.eclipse.commons 1 0 2026-03-17 19:37:23.009 +!MESSAGE executing callback sts4.classpath.wgCTVSyv FAILED + +!ENTRY org.springframework.tooling.ls.eclipse.commons 4 0 2026-03-17 19:37:23.009 +!MESSAGE org.eclipse.lsp4j.jsonrpc.ResponseErrorException: Internal error. +!STACK 0 +java.util.concurrent.ExecutionException: org.eclipse.lsp4j.jsonrpc.ResponseErrorException: Internal error. + at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396) + at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2096) + at org.springframework.tooling.ls.eclipse.commons.LSP4ECommandExecutor.executeClientCommand(LSP4ECommandExecutor.java:31) + at org.springframework.tooling.jdt.ls.commons.classpath.SendClasspathNotificationsJob.flush(SendClasspathNotificationsJob.java:178) + at org.springframework.tooling.jdt.ls.commons.classpath.SendClasspathNotificationsJob.run(SendClasspathNotificationsJob.java:149) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) +Caused by: org.eclipse.lsp4j.jsonrpc.ResponseErrorException: Internal error. + at org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.handleResponse(RemoteEndpoint.java:214) + at org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.consume(RemoteEndpoint.java:198) + at org.eclipse.lsp4e.LanguageServerWrapper.lambda$3(LanguageServerWrapper.java:449) + at org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.handleMessage(StreamMessageProducer.java:189) + at org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.listen(StreamMessageProducer.java:97) + at org.eclipse.lsp4j.jsonrpc.json.ConcurrentMessageProcessor.run(ConcurrentMessageProcessor.java:97) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 19:37:23.617 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) + +!ENTRY org.eclipse.jdt.core 4 4 2026-03-17 19:37:29.719 +!MESSAGE Failed to save JDT index: Index for /xxxthegame +!STACK 0 +java.io.FileNotFoundException: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core/9341915.index (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at org.eclipse.jdt.internal.core.index.FileIndexLocation.getInputStream(FileIndexLocation.java:83) + at org.eclipse.jdt.internal.core.index.DiskIndex.readAllDocumentNames(DiskIndex.java:633) + at org.eclipse.jdt.internal.core.index.DiskIndex.mergeWith(DiskIndex.java:536) + at org.eclipse.jdt.internal.core.index.Index.save(Index.java:229) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndex(IndexManager.java:1135) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1178) + at org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:822) + at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:508) + at java.base/java.lang.Thread.run(Thread.java:1583) +!SESSION 2026-03-17 19:39:43.512 ----------------------------------------------- +eclipse.buildId=4.39.0.20260305-0817 +java.version=21.0.10 +java.vendor=Eclipse Adoptium +BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=de_DE +Framework arguments: -product org.eclipse.epp.package.java.product +Command-line arguments: -os linux -ws gtk -arch x86_64 -product org.eclipse.epp.package.java.product + +!ENTRY ch.qos.logback.classic 1 0 2026-03-17 19:39:44.594 +!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized. + +!ENTRY ch.qos.logback.classic 1 0 2026-03-17 19:39:53.565 +!MESSAGE Logback config file: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.101.20251017-1242.xml + +!ENTRY org.eclipse.core.runtime 4 0 2026-03-17 19:39:54.915 +!MESSAGE Invalid input url:platform:/plugin/org.springframework.ide.eclipse.boot.dash/icons/boot-icon.png +!STACK 0 +java.io.IOException: Unable to resolve plug-in "org.springframework.ide.eclipse.boot.dash". + at org.eclipse.core.internal.runtime.PlatformURLPluginConnection.parse(PlatformURLPluginConnection.java:66) + at org.eclipse.core.internal.runtime.FindSupport.find(FindSupport.java:331) + at org.eclipse.core.runtime.FileLocator.find(FileLocator.java:219) + at org.eclipse.jface.resource.URLImageDescriptor.resolvePathVariables(URLImageDescriptor.java:280) + at org.eclipse.jface.resource.URLImageDescriptor.getFilePath(URLImageDescriptor.java:253) + at org.eclipse.jface.resource.URLImageDescriptor.lambda$0(URLImageDescriptor.java:64) + at org.eclipse.swt.internal.DPIUtil.lambda$3(DPIUtil.java:386) + at org.eclipse.swt.internal.DPIUtil.getElementAtZoom(DPIUtil.java:395) + at org.eclipse.swt.internal.DPIUtil.validateAndGetImagePathAtZoom(DPIUtil.java:386) + at org.eclipse.swt.graphics.Image.initFromFileNameProvider(Image.java:791) + at org.eclipse.swt.graphics.Image.(Image.java:644) + at org.eclipse.jface.resource.URLImageDescriptor.createImage(URLImageDescriptor.java:300) + at org.eclipse.jface.resource.ImageDescriptor.createResource(ImageDescriptor.java:271) + at org.eclipse.jface.resource.DeviceResourceManager.allocate(DeviceResourceManager.java:56) + at org.eclipse.jface.resource.AbstractResourceManager.create(AbstractResourceManager.java:92) + at org.eclipse.jface.resource.LazyResourceManager.create(LazyResourceManager.java:95) + at org.eclipse.jface.resource.ResourceManager.createImageWithDefault(ResourceManager.java:192) + at org.eclipse.jface.resource.ImageRegistry.get(ImageRegistry.java:208) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.getImageFromURI(SWTPartRenderer.java:236) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.getImage(SWTPartRenderer.java:246) + at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.createTab(StackRenderer.java:1063) + at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.processContents(LazyStackRenderer.java:202) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveRenderer.processContents(PerspectiveRenderer.java:49) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.showTab(PerspectiveStackRenderer.java:80) + at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.postProcess(LazyStackRenderer.java:114) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.postProcess(PerspectiveStackRenderer.java:62) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:689) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer.processContents(WBWRenderer.java:651) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1088) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) + +!ENTRY org.eclipse.jface 4 0 2026-03-17 19:39:54.917 +!MESSAGE Unable to resolve plug-in "org.springframework.ide.eclipse.boot.dash". +!STACK 0 +java.io.IOException: Unable to resolve plug-in "org.springframework.ide.eclipse.boot.dash". + at org.eclipse.core.internal.runtime.PlatformURLPluginConnection.parse(PlatformURLPluginConnection.java:66) + at org.eclipse.core.internal.runtime.PlatformURLPluginConnection.resolve(PlatformURLPluginConnection.java:76) + at org.eclipse.core.internal.boot.PlatformURLHandler.openConnection(PlatformURLHandler.java:72) + at org.eclipse.osgi.internal.url.URLStreamHandlerProxy.openConnection(URLStreamHandlerProxy.java:138) + at org.eclipse.equinox.plurl.impl.PlurlImpl$PlurlRootURLStreamHandler.openConnection(PlurlImpl.java:1453) + at java.base/java.net.URL.openConnection(URL.java:1258) + at org.eclipse.core.internal.runtime.PlatformURLConverter.toFileURL(PlatformURLConverter.java:34) + at org.eclipse.core.runtime.FileLocator.toFileURL(FileLocator.java:277) + at org.eclipse.jface.resource.URLImageDescriptor.getFilePath(URLImageDescriptor.java:254) + at org.eclipse.jface.resource.URLImageDescriptor.lambda$0(URLImageDescriptor.java:64) + at org.eclipse.swt.internal.DPIUtil.lambda$3(DPIUtil.java:386) + at org.eclipse.swt.internal.DPIUtil.getElementAtZoom(DPIUtil.java:395) + at org.eclipse.swt.internal.DPIUtil.validateAndGetImagePathAtZoom(DPIUtil.java:386) + at org.eclipse.swt.graphics.Image.initFromFileNameProvider(Image.java:791) + at org.eclipse.swt.graphics.Image.(Image.java:644) + at org.eclipse.jface.resource.URLImageDescriptor.createImage(URLImageDescriptor.java:300) + at org.eclipse.jface.resource.ImageDescriptor.createResource(ImageDescriptor.java:271) + at org.eclipse.jface.resource.DeviceResourceManager.allocate(DeviceResourceManager.java:56) + at org.eclipse.jface.resource.AbstractResourceManager.create(AbstractResourceManager.java:92) + at org.eclipse.jface.resource.LazyResourceManager.create(LazyResourceManager.java:95) + at org.eclipse.jface.resource.ResourceManager.createImageWithDefault(ResourceManager.java:192) + at org.eclipse.jface.resource.ImageRegistry.get(ImageRegistry.java:208) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.getImageFromURI(SWTPartRenderer.java:236) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.getImage(SWTPartRenderer.java:246) + at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.createTab(StackRenderer.java:1063) + at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.processContents(LazyStackRenderer.java:202) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveRenderer.processContents(PerspectiveRenderer.java:49) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.showTab(PerspectiveStackRenderer.java:80) + at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.postProcess(LazyStackRenderer.java:114) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.postProcess(PerspectiveStackRenderer.java:62) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:689) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer.processContents(WBWRenderer.java:651) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1088) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) + +!ENTRY org.eclipse.core.runtime 4 0 2026-03-17 19:39:54.917 +!MESSAGE Invalid input url:platform:/plugin/org.springframework.ide.eclipse.boot.dash/icons/boot-icon.png +!STACK 0 +java.io.IOException: Unable to resolve plug-in "org.springframework.ide.eclipse.boot.dash". + at org.eclipse.core.internal.runtime.PlatformURLPluginConnection.parse(PlatformURLPluginConnection.java:66) + at org.eclipse.core.internal.runtime.FindSupport.find(FindSupport.java:331) + at org.eclipse.core.runtime.FileLocator.find(FileLocator.java:219) + at org.eclipse.jface.resource.URLImageDescriptor.resolvePathVariables(URLImageDescriptor.java:280) + at org.eclipse.jface.resource.URLImageDescriptor.getStream(URLImageDescriptor.java:170) + at org.eclipse.jface.resource.URLImageDescriptor.getImageData(URLImageDescriptor.java:134) + at org.eclipse.jface.resource.URLImageDescriptor.getImageData(URLImageDescriptor.java:108) + at org.eclipse.jface.resource.URLImageDescriptor.lambda$2(URLImageDescriptor.java:73) + at org.eclipse.swt.internal.DPIUtil.lambda$2(DPIUtil.java:366) + at org.eclipse.swt.internal.DPIUtil.getElementAtZoom(DPIUtil.java:395) + at org.eclipse.swt.internal.DPIUtil.validateAndGetImageDataAtZoom(DPIUtil.java:366) + at org.eclipse.swt.graphics.Image.initFromImageDataProvider(Image.java:806) + at org.eclipse.swt.graphics.Image.(Image.java:681) + at org.eclipse.jface.resource.URLImageDescriptor.createImage(URLImageDescriptor.java:311) + at org.eclipse.jface.resource.ImageDescriptor.createResource(ImageDescriptor.java:271) + at org.eclipse.jface.resource.DeviceResourceManager.allocate(DeviceResourceManager.java:56) + at org.eclipse.jface.resource.AbstractResourceManager.create(AbstractResourceManager.java:92) + at org.eclipse.jface.resource.LazyResourceManager.create(LazyResourceManager.java:95) + at org.eclipse.jface.resource.ResourceManager.createImageWithDefault(ResourceManager.java:192) + at org.eclipse.jface.resource.ImageRegistry.get(ImageRegistry.java:208) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.getImageFromURI(SWTPartRenderer.java:236) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.getImage(SWTPartRenderer.java:246) + at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.createTab(StackRenderer.java:1063) + at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.processContents(LazyStackRenderer.java:202) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveRenderer.processContents(PerspectiveRenderer.java:49) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.showTab(PerspectiveStackRenderer.java:80) + at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.postProcess(LazyStackRenderer.java:114) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.postProcess(PerspectiveStackRenderer.java:62) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:689) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer.processContents(WBWRenderer.java:651) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1088) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) + +!ENTRY org.eclipse.jface 2 0 2026-03-17 19:39:54.917 +!MESSAGE The image could not be loaded: URLImageDescriptor(platform:/plugin/org.springframework.ide.eclipse.boot.dash/icons/boot-icon.png) +!STACK 0 +org.eclipse.jface.resource.DeviceResourceException: Unable to create resource URLImageDescriptor(platform:/plugin/org.springframework.ide.eclipse.boot.dash/icons/boot-icon.png) + at org.eclipse.jface.resource.ImageDescriptor.createResource(ImageDescriptor.java:273) + at org.eclipse.jface.resource.DeviceResourceManager.allocate(DeviceResourceManager.java:56) + at org.eclipse.jface.resource.AbstractResourceManager.create(AbstractResourceManager.java:92) + at org.eclipse.jface.resource.LazyResourceManager.create(LazyResourceManager.java:95) + at org.eclipse.jface.resource.ResourceManager.createImageWithDefault(ResourceManager.java:192) + at org.eclipse.jface.resource.ImageRegistry.get(ImageRegistry.java:208) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.getImageFromURI(SWTPartRenderer.java:236) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.getImage(SWTPartRenderer.java:246) + at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.createTab(StackRenderer.java:1063) + at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.processContents(LazyStackRenderer.java:202) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveRenderer.processContents(PerspectiveRenderer.java:49) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.showTab(PerspectiveStackRenderer.java:80) + at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.postProcess(LazyStackRenderer.java:114) + at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.postProcess(PerspectiveStackRenderer.java:62) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:689) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:148) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:73) + at org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer.processContents(WBWRenderer.java:651) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:685) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:775) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:739) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:723) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1088) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2026-03-17 19:39:55.973 +!MESSAGE Removing PartDescriptorImpl with the "org.eclipse.linuxtools.docker.ui.dockerContainersView" id and the "Docker Containers" label.It points to the non available "bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView" class. Bundle might have been uninstalled + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2026-03-17 19:39:55.973 +!MESSAGE Removing PartDescriptorImpl with the "org.eclipse.linuxtools.docker.ui.dockerImagesView" id and the "Docker Images" label.It points to the non available "bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView" class. Bundle might have been uninstalled + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2026-03-17 19:39:55.973 +!MESSAGE Removing PartDescriptorImpl with the "org.eclipse.linuxtools.docker.ui.dockerExplorerView" id and the "Docker Explorer" label.It points to the non available "bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView" class. Bundle might have been uninstalled + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2026-03-17 19:39:55.973 +!MESSAGE Removing PartDescriptorImpl with the "org.eclipse.linuxtools.docker.ui.dockerImageHierarchyView" id and the "Docker Image Hierarchy" label.It points to the non available "bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView" class. Bundle might have been uninstalled + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2026-03-17 19:39:55.973 +!MESSAGE Removing PartDescriptorImpl with the "org.springframework.ide.eclipse.boot.dash.views.BootDashView" id and the "Boot Dashboard" label.It points to the non available "bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView" class. Bundle might have been uninstalled + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2026-03-17 19:39:55.973 +!MESSAGE Removing PartDescriptorImpl with the "org.springframework.tooling.boot.ls.views.LogicalStructureView" id and the "Logical Structure" label.It points to the non available "bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView" class. Bundle might have been uninstalled + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2026-03-17 19:39:55.974 +!MESSAGE Removing PartDescriptorImpl with the "org.springframework.tooling.ls.eclipse.gotosymbol.view.SpringSymbolsView" id and the "Spring Symbols" label.It points to the non available "bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView" class. Bundle might have been uninstalled + +!ENTRY org.eclipse.ui 4 0 2026-03-17 19:40:09.961 +!MESSAGE Unhandled event loop exception +!STACK 0 +java.lang.IllegalArgumentException: Argument not valid + at org.eclipse.swt.SWT.error(SWT.java:4931) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.SWT.error(SWT.java:4836) + at org.eclipse.swt.graphics.Image.init(Image.java:1364) + at org.eclipse.swt.graphics.Image.(Image.java:219) + at org.eclipse.equinox.internal.p2.ui.discovery.util.GradientCanvas.onPaint(GradientCanvas.java:168) + at org.eclipse.equinox.internal.p2.ui.discovery.util.GradientCanvas.lambda$0(GradientCanvas.java:81) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1665) + at org.eclipse.swt.widgets.Control.gtk_draw(Control.java:3866) + at org.eclipse.swt.widgets.Scrollable.gtk_draw(Scrollable.java:394) + at org.eclipse.swt.widgets.Composite.gtk_draw(Composite.java:507) + at org.eclipse.swt.widgets.Canvas.gtk_draw(Canvas.java:173) + at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:2612) + at org.eclipse.swt.widgets.Control.windowProc(Control.java:6833) + at org.eclipse.swt.widgets.Display.windowProc(Display.java:6152) + at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_do_event(Native Method) + at org.eclipse.swt.widgets.Display.eventProc(Display.java:1624) + at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_iteration_do(Native Method) + at org.eclipse.swt.browser.WebKit$Webkit2AsyncToSync.execAsyncAndWaitForReturn(WebKit.java:1426) + at org.eclipse.swt.browser.WebKit$Webkit2AsyncToSync.runjavascript(WebKit.java:1113) + at org.eclipse.swt.browser.WebKit$Webkit2AsyncToSync.evaluate(WebKit.java:1070) + at org.eclipse.swt.browser.WebKit.evaluate(WebKit.java:1443) + at org.eclipse.swt.browser.WebKit.close(WebKit.java:931) + at org.eclipse.swt.browser.WebKit.onDispose(WebKit.java:1937) + at org.eclipse.swt.browser.WebKit.lambda$5(WebKit.java:820) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Widget.release(Widget.java:1400) + at org.eclipse.swt.widgets.Control.release(Control.java:4712) + at org.eclipse.swt.widgets.Widget.dispose(Widget.java:576) + at org.eclipse.epp.internal.mpc.ui.wizards.AbstractMarketplaceDiscoveryItem.computeBrowserAvailable(AbstractMarketplaceDiscoveryItem.java:521) + at org.eclipse.epp.internal.mpc.ui.wizards.AbstractMarketplaceDiscoveryItem.createInfoLink(AbstractMarketplaceDiscoveryItem.java:394) + at org.eclipse.epp.internal.mpc.ui.wizards.AbstractMarketplaceDiscoveryItem.createDescription(AbstractMarketplaceDiscoveryItem.java:341) + at org.eclipse.epp.internal.mpc.ui.wizards.AbstractMarketplaceDiscoveryItem.createContent(AbstractMarketplaceDiscoveryItem.java:241) + at org.eclipse.epp.internal.mpc.ui.wizards.AbstractMarketplaceDiscoveryItem.createContent(AbstractMarketplaceDiscoveryItem.java:203) + at org.eclipse.epp.internal.mpc.ui.wizards.AbstractMarketplaceDiscoveryItem.(AbstractMarketplaceDiscoveryItem.java:168) + at org.eclipse.epp.internal.mpc.ui.wizards.DiscoveryItem.(DiscoveryItem.java:86) + at org.eclipse.epp.internal.mpc.ui.wizards.MarketplaceViewer.createDiscoveryItem(MarketplaceViewer.java:462) + at org.eclipse.epp.internal.mpc.ui.wizards.MarketplaceViewer.doCreateViewerItem(MarketplaceViewer.java:412) + at org.eclipse.equinox.internal.p2.ui.discovery.wizards.CatalogViewer$3.doCreateItem(CatalogViewer.java:342) + at org.eclipse.equinox.internal.p2.ui.discovery.util.ControlListViewer.createNewItem(ControlListViewer.java:241) + at org.eclipse.equinox.internal.p2.ui.discovery.util.ControlListViewer.refreshAll(ControlListViewer.java:483) + at org.eclipse.equinox.internal.p2.ui.discovery.util.ControlListViewer.inputChanged(ControlListViewer.java:355) + at org.eclipse.jface.viewers.ContentViewer.setInput(ContentViewer.java:279) + at org.eclipse.jface.viewers.StructuredViewer.setInput(StructuredViewer.java:1639) + at org.eclipse.equinox.internal.p2.ui.discovery.wizards.CatalogViewer.catalogUpdated(CatalogViewer.java:248) + at org.eclipse.epp.internal.mpc.ui.wizards.MarketplaceViewer.access$3(MarketplaceViewer.java:1) + at org.eclipse.epp.internal.mpc.ui.wizards.MarketplaceViewer.lambda$1(MarketplaceViewer.java:354) + at org.eclipse.epp.internal.mpc.ui.wizards.MarketplaceViewer.runUpdate(MarketplaceViewer.java:712) + at org.eclipse.epp.internal.mpc.ui.wizards.MarketplaceViewer.catalogUpdated(MarketplaceViewer.java:353) + at org.eclipse.equinox.internal.p2.ui.discovery.wizards.CatalogViewer.updateCatalog(CatalogViewer.java:588) + at org.eclipse.epp.internal.mpc.ui.wizards.MarketplaceViewer.updateCatalog(MarketplaceViewer.java:989) + at org.eclipse.epp.internal.mpc.ui.wizards.MarketplacePage.safeUpdateCatalog(MarketplacePage.java:798) + at org.eclipse.epp.internal.mpc.ui.wizards.MarketplacePage.lambda$4(MarketplacePage.java:786) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:40) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:132) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:5035) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4500) + at org.eclipse.jface.window.Window.runEventLoop(Window.java:819) + at org.eclipse.jface.window.Window.open(Window.java:799) + at org.eclipse.epp.internal.mpc.ui.commands.AbstractMarketplaceWizardCommand.openWizardDialog(AbstractMarketplaceWizardCommand.java:146) + at org.eclipse.epp.internal.mpc.ui.commands.AbstractMarketplaceWizardCommand.execute(AbstractMarketplaceWizardCommand.java:73) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:277) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:98) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:305) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:237) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:174) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:165) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:488) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:484) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:204) + at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.executeItem(HandledContributionItem.java:446) + at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem.handleWidgetSelection(AbstractContributionItem.java:471) + at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem.lambda$2(AbstractContributionItem.java:493) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:5060) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4497) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) + +!ENTRY org.eclipse.jdt.launching 4 4 2026-03-17 19:42:27.557 +!MESSAGE Could not determine Java version for location /snap/eclipse/131/usr/lib/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_21.0.9.v20251105-0741/jre. + +!ENTRY org.eclipse.jdt.launching 4 4 2026-03-17 19:42:31.369 +!MESSAGE Could not determine Java version for location /snap/eclipse/131/usr/lib/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_21.0.9.v20251105-0741/jre. + +!ENTRY org.eclipse.jdt.launching 4 4 2026-03-17 19:42:32.050 +!MESSAGE Could not determine Java version for location /snap/eclipse/131/usr/lib/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_21.0.9.v20251105-0741/jre. + +!ENTRY org.eclipse.jdt.launching 4 4 2026-03-17 19:42:44.973 +!MESSAGE Could not determine Java version for location /snap/eclipse/131/usr/lib/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_21.0.9.v20251105-0741/jre. + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:44:52.355 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.jdt.launching 4 4 2026-03-17 19:45:24.590 +!MESSAGE Could not determine Java version for location /snap/eclipse/131/usr/lib/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_21.0.9.v20251105-0741/jre. + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:45:32.445 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.jdt.launching 4 4 2026-03-17 19:45:49.305 +!MESSAGE Could not determine Java version for location /snap/eclipse/131/usr/lib/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_21.0.9.v20251105-0741/jre. + +!ENTRY org.eclipse.jdt.launching 4 4 2026-03-17 19:45:49.580 +!MESSAGE Could not determine Java version for location /snap/eclipse/131/usr/lib/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_21.0.9.v20251105-0741/jre. + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:46:23.513 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.core.resources 2 2 2026-03-17 19:47:44.434 +!MESSAGE Save operation warnings. +!SUBENTRY 1 org.eclipse.core.resources 2 234 2026-03-17 19:47:44.434 +!MESSAGE The project description file (.project) for 'xxxthegame' was missing. This file contains important information about the project. A new project description file has been created, but some information about the project may have been lost. + +!ENTRY org.eclipse.core.resources 2 10035 2026-03-17 19:49:42.347 +!MESSAGE The workspace will exit with unsaved changes in this session. +!SESSION 2026-03-17 19:49:45.581 ----------------------------------------------- +eclipse.buildId=4.39.0.20260305-0817 +java.version=21.0.10 +java.vendor=Eclipse Adoptium +BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=de_DE +Framework arguments: -product org.eclipse.epp.package.java.product +Command-line arguments: -os linux -ws gtk -arch x86_64 -product org.eclipse.epp.package.java.product + +!ENTRY ch.qos.logback.classic 1 0 2026-03-17 19:49:46.854 +!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized. + +!ENTRY org.eclipse.core.resources 2 10035 2026-03-17 19:49:49.192 +!MESSAGE The workspace exited with unsaved changes in the previous session; refreshing workspace to recover changes. + +!ENTRY ch.qos.logback.classic 1 0 2026-03-17 19:49:49.467 +!MESSAGE Logback config file: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.101.20251017-1242.xml + +!ENTRY org.eclipse.ui 2 0 2026-03-17 19:49:49.576 +!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points. +!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-17 19:49:49.576 +!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory' + +!ENTRY org.eclipse.ui 2 0 2026-03-17 19:49:49.683 +!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points. +!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-17 19:49:49.683 +!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory' + +!ENTRY org.eclipse.jdt.core 4 1006 2026-03-17 19:49:56.653 +!MESSAGE src/main/java/de/oaa/xxx/games/chastity/cardlock [in xxxthegame] is not on its project's build path +!STACK 1 +Java Model Exception: Error in Java Model (code 1006): src/main/java/de/oaa/xxx/games/chastity/cardlock [in xxxthegame] is not on its project's build path + at org.eclipse.jdt.internal.core.PackageFragmentRoot.getResolvedClasspathEntry(PackageFragmentRoot.java:637) + at org.eclipse.jdt.core.manipulation.OrganizeImportsOperation$TypeReferenceProcessor.process(OrganizeImportsOperation.java:434) + at org.eclipse.jdt.core.manipulation.OrganizeImportsOperation.createTextEdit(OrganizeImportsOperation.java:718) + at org.eclipse.jdt.core.manipulation.OrganizeImportsOperation.run(OrganizeImportsOperation.java:667) + at org.eclipse.jdt.ui.actions.OrganizeImportsAction$3.run(OrganizeImportsAction.java:297) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) +!SUBENTRY 1 org.eclipse.jdt.core 4 1006 2026-03-17 19:49:56.654 +!MESSAGE src/main/java/de/oaa/xxx/games/chastity/cardlock [in xxxthegame] is not on its project's build path + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:50:04.793 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more + +!ENTRY org.eclipse.ui.workbench 4 0 2026-03-17 19:50:12.907 +!MESSAGE Dynamic menu contribution 'DynamicContributionItems(id=org.eclipse.terminal.connector.local.LocalLauncherDynamicContributionItems, visible=true)' threw an unexpected exception +!STACK 0 +org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden)) + at org.eclipse.swt.SWT.error(SWT.java:4950) + at org.eclipse.swt.SWT.error(SWT.java:4865) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:207) + at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:198) + at org.eclipse.terminal.view.ui.internal.local.showin.ExternalExecutablesUtils.loadImage(ExternalExecutablesUtils.java:38) + at org.eclipse.terminal.view.ui.internal.local.showin.DynamicContributionItems.getContributionItems(DynamicContributionItems.java:76) + at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:83) + at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:57) + at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:194) + at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:727) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:804) + at org.eclipse.jface.action.MenuManager.update(MenuManager.java:671) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.scheduleManagerUpdate(MenuManagerRenderer.java:1149) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.subscribeUIElementTopicVisible(MenuManagerRenderer.java:211) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:183) + at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:136) + at org.eclipse.swt.widgets.Display.syncExec(Display.java:5950) + at org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize.syncExec(DisplayUISynchronize.java:34) + at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:65) + at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:206) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:201) + at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) + at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) + at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) + at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132) + at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:73) + at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:48) + at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55) + at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:61) + at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424) + at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setVisible(UIElementImpl.java:365) + at org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord.updateVisibility(ContributionRecord.java:110) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:169) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRendererFilter.updateElementVisibility(MenuManagerRendererFilter.java:179) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.showMenu(MenuManagerShowProcessor.java:243) + at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerShowProcessor.menuAboutToHide(MenuManagerShowProcessor.java:111) + at org.eclipse.jface.internal.MenuManagerEventHelper.showEventPostHelper(MenuManagerEventHelper.java:89) + at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:467) + at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:493) + at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:297) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1661) + at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:290) + at org.eclipse.swt.widgets.Display.runPopups(Display.java:5102) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4488) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + at org.eclipse.equinox.launcher.Main.main(Main.java:1387) +Caused by: java.io.FileNotFoundException: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico (Datei oder Verzeichnis nicht gefunden) + at java.base/java.io.FileInputStream.open0(Native Method) + at java.base/java.io.FileInputStream.open(FileInputStream.java:213) + at java.base/java.io.FileInputStream.(FileInputStream.java:152) + at java.base/java.io.FileInputStream.(FileInputStream.java:106) + at org.eclipse.swt.graphics.ImageLoader.loadByZoom(ImageLoader.java:204) + ... 68 more diff --git a/.metadata/.plugins/org.eclipse.buildship.core/gradle/versions.json b/.metadata/.plugins/org.eclipse.buildship.core/gradle/versions.json index 638e416..5366b44 100644 --- a/.metadata/.plugins/org.eclipse.buildship.core/gradle/versions.json +++ b/.metadata/.plugins/org.eclipse.buildship.core/gradle/versions.json @@ -1,7 +1,7 @@ [ { - "version" : "9.4.1-20260316020012+0000", - "buildTime" : "20260316020012+0000", - "commitId" : "bf53443ce3925ea6141adbe2d2fd96493865b6ee", + "version" : "9.4.1-20260317014409+0000", + "buildTime" : "20260317014409+0000", + "commitId" : "0a84d6751921709fbc7d552a50d9e3b34eb1930d", "current" : false, "snapshot" : true, "nightly" : false, @@ -10,15 +10,15 @@ "rcFor" : "", "milestoneFor" : "", "broken" : false, - "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.4.1-20260316020012+0000-bin.zip", - "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.4.1-20260316020012+0000-bin.zip.sha256", - "checksum" : "2e805c642bbf8b8ccf39cf855b202bed260018f7ca61c37408c7f4c32a36a3e2", - "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.4.1-20260316020012+0000-wrapper.jar.sha256", + "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.4.1-20260317014409+0000-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.4.1-20260317014409+0000-bin.zip.sha256", + "checksum" : "b0756f51c7876351c3c18ee7c0777bd2c6b2e18bf4bf31dc17d367310f6cce5c", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.4.1-20260317014409+0000-wrapper.jar.sha256", "wrapperChecksum" : "55243ef57851f12b070ad14f7f5bb8302daceeebc5bce5ece5fa6edb23e1145c" }, { - "version" : "9.5.0-20260316005115+0000", - "buildTime" : "20260316005115+0000", - "commitId" : "b2fdb4cec79e4c0b1b5c1bfeebc8d4b5fd65c690", + "version" : "9.5.0-20260317004629+0000", + "buildTime" : "20260317004629+0000", + "commitId" : "644201d0b1d42cde4ea13645efefbdbf004cd6b1", "current" : false, "snapshot" : true, "nightly" : true, @@ -27,10 +27,10 @@ "rcFor" : "", "milestoneFor" : "", "broken" : false, - "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260316005115+0000-bin.zip", - "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260316005115+0000-bin.zip.sha256", - "checksum" : "bde9dc37434e5942fdd1e2f9c6f9571fc649224053e691021e2e87ba5af4a2b7", - "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260316005115+0000-wrapper.jar.sha256", + "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260317004629+0000-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260317004629+0000-bin.zip.sha256", + "checksum" : "fa62a8b9f5ed9a718f7a8d9e0d3221ea5a8b15dd1f07c8edb72e871615c1eac0", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260317004629+0000-wrapper.jar.sha256", "wrapperChecksum" : "7ef3d73bd95c047814d76ec8324f72deefb96593eb9ce87aa06ecdcdaba7ffe8" }, { "version" : "9.5.0-milestone-7", diff --git a/.metadata/.plugins/org.eclipse.buildship.core/project-preferences/xxxthegame b/.metadata/.plugins/org.eclipse.buildship.core/project-preferences/xxxthegame index 52878f0..44a7f07 100644 --- a/.metadata/.plugins/org.eclipse.buildship.core/project-preferences/xxxthegame +++ b/.metadata/.plugins/org.eclipse.buildship.core/project-preferences/xxxthegame @@ -1,8 +1,8 @@ # -#Mon Mar 16 20:07:36 CET 2026 +#Tue Mar 17 19:49:39 CET 2026 buildDir=build buildScriptPath=build.gradle.kts -classpath=\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n +classpath=\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n\t\n\t\t\n\t\t\n\t\n\n\n derivedResources=.gradle\:build gradleVersion=8.9 hasAutoBuildTasks=false diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/xxxthegame/.markers b/.metadata/.plugins/org.eclipse.core.resources/.projects/xxxthegame/.markers index 533fb40..0ad8bdf 100644 Binary files a/.metadata/.plugins/org.eclipse.core.resources/.projects/xxxthegame/.markers and b/.metadata/.plugins/org.eclipse.core.resources/.projects/xxxthegame/.markers differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index index 197e1c6..a973d88 100644 Binary files a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index and b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources index 91865f4..7fcd4e7 100644 Binary files a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources and b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources differ diff --git a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi index 712aab0..c458930 100644 --- a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi +++ b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -1,8 +1,8 @@ - - + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration - + @@ -11,9 +11,9 @@ topLevel shellMaximized - - - + + + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation persp.actionSet:org.eclipse.ui.cheatsheets.actionSet @@ -83,116 +83,114 @@ persp.editorOnboardingCommand:Show Key Assist$$$Shift+Ctrl+L persp.editorOnboardingCommand:New$$$Ctrl+N persp.editorOnboardingCommand:Open Type$$$Shift+Ctrl+T - - - - + + + + org.eclipse.e4.primaryNavigationStack - active - noFocus - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:Java - - + + View categoryTag:Other - - + + View categoryTag:Git - - - - + + + + org.eclipse.e4.secondaryNavigationStack - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Mylyn - + View categoryTag:Java - + View categoryTag:Ant - + org.eclipse.e4.secondaryDataStack Oomph Gradle - + View categoryTag:General - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Terminal - + View categoryTag:Gradle - + View categoryTag:Gradle @@ -200,7 +198,7 @@ - + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation persp.actionSet:org.eclipse.ui.cheatsheets.actionSet @@ -249,100 +247,100 @@ persp.editorOnboardingCommand:Step Over$$$F6 persp.editorOnboardingCommand:Step Return$$$F7 persp.editorOnboardingCommand:Resume$$$F8 - - + + org.eclipse.e4.primaryNavigationStack - + View categoryTag:Debug - + View categoryTag:General - + View categoryTag:Java active - + View categoryTag:Java - + View categoryTag:Java - - - - + + + + org.eclipse.e4.secondaryNavigationStack - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Ant - - + + View categoryTag:General - + View categoryTag:General - + View categoryTag:Debug - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Terminal - + View categoryTag:Debug - + View categoryTag:General @@ -351,2783 +349,2537 @@ - - + + View categoryTag:Help - + View categoryTag:General - + View categoryTag:Help - + View categoryTag:Help - + View categoryTag:General - + View categoryTag:Help - - + + EditorStack org.eclipse.e4.primaryDataStack - - + active + + Editor removeOnHide org.eclipse.jdt.ui.CompilationUnitEditor + active + activeOnClose - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.ui.genericeditor.GenericEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.ui.genericeditor.GenericEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - + + Editor removeOnHide org.eclipse.jdt.ui.CompilationUnitEditor - + - + View categoryTag:Java - active - + ViewMenu menuContribution:menu - + - + View categoryTag:Java - + + View categoryTag:General - - - - - - View - categoryTag:General - + ViewMenu menuContribution:menu - + - + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + View categoryTag:Java - + View categoryTag:Java - + - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + highlighted + ViewMenu menuContribution:menu - + - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Mylyn - + View categoryTag:Terminal - + View categoryTag:Java - + View categoryTag:Git - + View categoryTag:Java - + View categoryTag:Other - + ViewMenu menuContribution:menu - + - + View categoryTag:Ant - + View categoryTag:Gradle - + ViewMenu menuContribution:menu - + - + View categoryTag:Gradle - + ViewMenu menuContribution:menu - + - + View categoryTag:Debug - + ViewMenu menuContribution:menu - + - + View categoryTag:Debug - + View categoryTag:Debug - + ViewMenu menuContribution:menu - + - + View categoryTag:Debug - + ViewMenu menuContribution:menu - + - + View categoryTag:Debug - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Debug - + ViewMenu menuContribution:menu - + - - + + toolbarSeparator - + - + Draggable - + - + toolbarSeparator - + - + Draggable - - + + - + toolbarSeparator - + - + Draggable - + Draggable - + Draggable - + Draggable - + toolbarSeparator - + - + Draggable - + - - Draggable - - + toolbarSeparator - + - + toolbarSeparator - + - + Draggable - + stretch SHOW_RESTORE_MENU - + Draggable HIDEABLE SHOW_RESTORE_MENU - - + + stretch - + Draggable - + Draggable - - + + - - - - - - - - - - - - - + + + + + + + + + + + + + platform:gtk - - - - + + + + platform:gtk - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - + + + + + - - + + - - - - - - - - - + + + + + + + + + - - + + - - - + + + - - - - - + + + + + - - + + - - - + + + - - - + + + - - - - - - - - + + + + + + + + platform:gtk - - - - - + + + + + - - + + - - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + + + - - + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - + + + - - + + + + + + + - - - - - - - + + + + - - - - + + + + + + + + - - - - - - - - + + - - + + + + + + - - - - - - + + + + + + - - - - - - + + - - + + + + + + + + - - - - - - - - + + - - - + + + + - - - - + + - - + + - - + + + - - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor removeOnHide - + View categoryTag:Ant - + View categoryTag:Gradle - + View categoryTag:Gradle - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Java - + View categoryTag:Git - + View categoryTag:Git - + View categoryTag:Git - + View categoryTag:Git NoRestore - + View categoryTag:Git - + View categoryTag:Help - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Debug - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Language Servers - + View categoryTag:Language Servers - + View categoryTag:Language Servers - + View categoryTag:Maven - + View categoryTag:Maven - + View categoryTag:Maven - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Oomph - + View categoryTag:Oomph NoRestore - + View categoryTag:Plug-in Development - + View categoryTag:General - + View categoryTag:Version Control (Team) - + View categoryTag:Version Control (Team) - + View categoryTag:Terminal - + View categoryTag:Help - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Help - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - - - - View - categoryTag:Docker - - - - - View - categoryTag:Docker - - - - - View - categoryTag:Docker - - - - - View - categoryTag:Docker - - - - - View - categoryTag:Spring - - - - - View - categoryTag:Spring - - - - - View - categoryTag:Spring - - - + + glue move_after:PerspectiveSpacer SHOW_RESTORE_MENU - + move_after:Spacer Glue HIDEABLE SHOW_RESTORE_MENU - + glue move_after:SearchField SHOW_RESTORE_MENU - - - - - + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - - - + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.epp.mpc.ui/dialog_settings.xml b/.metadata/.plugins/org.eclipse.epp.mpc.ui/dialog_settings.xml index e32683b..4ef5ec0 100644 --- a/.metadata/.plugins/org.eclipse.epp.mpc.ui/dialog_settings.xml +++ b/.metadata/.plugins/org.eclipse.epp.mpc.ui/dialog_settings.xml @@ -3,7 +3,7 @@
- +
diff --git a/.metadata/.plugins/org.eclipse.equinox.p2.ui/dialog_settings.xml b/.metadata/.plugins/org.eclipse.equinox.p2.ui/dialog_settings.xml index c5d9f93..2993ddf 100644 --- a/.metadata/.plugins/org.eclipse.equinox.p2.ui/dialog_settings.xml +++ b/.metadata/.plugins/org.eclipse.equinox.p2.ui/dialog_settings.xml @@ -1,35 +1,35 @@ - -
-
- - - - - -
-
- - - - - - - - - -
-
- - - - - -
-
- - - - - -
-
+ +
+
+ + + + + +
+
+ + + + + + + + + +
+
+ + + + + +
+
+ + + + + +
+
diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1074122571.index b/.metadata/.plugins/org.eclipse.jdt.core/1074122571.index index 7366255..fd3deda 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1074122571.index and b/.metadata/.plugins/org.eclipse.jdt.core/1074122571.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1205982295.index b/.metadata/.plugins/org.eclipse.jdt.core/1205982295.index index 3d297c2..b486799 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1205982295.index and b/.metadata/.plugins/org.eclipse.jdt.core/1205982295.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1241285641.index b/.metadata/.plugins/org.eclipse.jdt.core/1241285641.index index 022928d..87e2986 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1241285641.index and b/.metadata/.plugins/org.eclipse.jdt.core/1241285641.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1256436118.index b/.metadata/.plugins/org.eclipse.jdt.core/1256436118.index index f2341dc..bd7e935 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1256436118.index and b/.metadata/.plugins/org.eclipse.jdt.core/1256436118.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1295630681.index b/.metadata/.plugins/org.eclipse.jdt.core/1295630681.index index e349009..699f89d 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1295630681.index and b/.metadata/.plugins/org.eclipse.jdt.core/1295630681.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1436262503.index b/.metadata/.plugins/org.eclipse.jdt.core/1436262503.index index ff6ca2b..09c47be 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1436262503.index and b/.metadata/.plugins/org.eclipse.jdt.core/1436262503.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1455171009.index b/.metadata/.plugins/org.eclipse.jdt.core/1455171009.index index fb0d941..a08d2cd 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1455171009.index and b/.metadata/.plugins/org.eclipse.jdt.core/1455171009.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1502997292.index b/.metadata/.plugins/org.eclipse.jdt.core/1502997292.index index 2527871..b81e60f 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1502997292.index and b/.metadata/.plugins/org.eclipse.jdt.core/1502997292.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1546736044.index b/.metadata/.plugins/org.eclipse.jdt.core/1546736044.index index 656c432..20f2c81 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1546736044.index and b/.metadata/.plugins/org.eclipse.jdt.core/1546736044.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/167025465.index b/.metadata/.plugins/org.eclipse.jdt.core/167025465.index index 148e8e2..58e2b9f 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/167025465.index and b/.metadata/.plugins/org.eclipse.jdt.core/167025465.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1781188320.index b/.metadata/.plugins/org.eclipse.jdt.core/1781188320.index index 333c842..8e4ca58 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1781188320.index and b/.metadata/.plugins/org.eclipse.jdt.core/1781188320.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1865797976.index b/.metadata/.plugins/org.eclipse.jdt.core/1865797976.index index 70d0d65..0c2087f 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1865797976.index and b/.metadata/.plugins/org.eclipse.jdt.core/1865797976.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1914043487.index b/.metadata/.plugins/org.eclipse.jdt.core/1914043487.index index ce5dbff..32da84a 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1914043487.index and b/.metadata/.plugins/org.eclipse.jdt.core/1914043487.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1965154635.index b/.metadata/.plugins/org.eclipse.jdt.core/1965154635.index index 9a05b1d..b427be8 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1965154635.index and b/.metadata/.plugins/org.eclipse.jdt.core/1965154635.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/198314732.index b/.metadata/.plugins/org.eclipse.jdt.core/198314732.index index 62ac8e3..fde44d5 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/198314732.index and b/.metadata/.plugins/org.eclipse.jdt.core/198314732.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1990965588.index b/.metadata/.plugins/org.eclipse.jdt.core/1990965588.index index 68815e7..8288cdf 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/1990965588.index and b/.metadata/.plugins/org.eclipse.jdt.core/1990965588.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2070370209.index b/.metadata/.plugins/org.eclipse.jdt.core/2070370209.index index 123b83c..ab55fbb 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2070370209.index and b/.metadata/.plugins/org.eclipse.jdt.core/2070370209.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2191830568.index b/.metadata/.plugins/org.eclipse.jdt.core/2191830568.index index 412ff19..fd578da 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2191830568.index and b/.metadata/.plugins/org.eclipse.jdt.core/2191830568.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2236377038.index b/.metadata/.plugins/org.eclipse.jdt.core/2236377038.index index 7f78d82..eeb7ad1 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2236377038.index and b/.metadata/.plugins/org.eclipse.jdt.core/2236377038.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2237645717.index b/.metadata/.plugins/org.eclipse.jdt.core/2237645717.index index 697b8b3..5a00e30 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2237645717.index and b/.metadata/.plugins/org.eclipse.jdt.core/2237645717.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2240786275.index b/.metadata/.plugins/org.eclipse.jdt.core/2240786275.index index 6a0d1aa..1f5086e 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2240786275.index and b/.metadata/.plugins/org.eclipse.jdt.core/2240786275.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2318770678.index b/.metadata/.plugins/org.eclipse.jdt.core/2318770678.index index 1d75ca2..5894fd9 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2318770678.index and b/.metadata/.plugins/org.eclipse.jdt.core/2318770678.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2390245932.index b/.metadata/.plugins/org.eclipse.jdt.core/2390245932.index index 685c59d..6ca1002 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2390245932.index and b/.metadata/.plugins/org.eclipse.jdt.core/2390245932.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2398089967.index b/.metadata/.plugins/org.eclipse.jdt.core/2398089967.index index 84059f6..73dc019 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2398089967.index and b/.metadata/.plugins/org.eclipse.jdt.core/2398089967.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2455882736.index b/.metadata/.plugins/org.eclipse.jdt.core/2455882736.index index d8ba316..0588c8c 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2455882736.index and b/.metadata/.plugins/org.eclipse.jdt.core/2455882736.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2455962971.index b/.metadata/.plugins/org.eclipse.jdt.core/2455962971.index index 5c5ee03..020f30c 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2455962971.index and b/.metadata/.plugins/org.eclipse.jdt.core/2455962971.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2488355463.index b/.metadata/.plugins/org.eclipse.jdt.core/2488355463.index index b5ab7ce..37f71f0 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2488355463.index and b/.metadata/.plugins/org.eclipse.jdt.core/2488355463.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2593736024.index b/.metadata/.plugins/org.eclipse.jdt.core/2593736024.index index d49e795..fcc42a0 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2593736024.index and b/.metadata/.plugins/org.eclipse.jdt.core/2593736024.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/26273648.index b/.metadata/.plugins/org.eclipse.jdt.core/26273648.index index f98726d..286f03f 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/26273648.index and b/.metadata/.plugins/org.eclipse.jdt.core/26273648.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2633787677.index b/.metadata/.plugins/org.eclipse.jdt.core/2633787677.index index 53b84dc..9de96a9 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2633787677.index and b/.metadata/.plugins/org.eclipse.jdt.core/2633787677.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2655170954.index b/.metadata/.plugins/org.eclipse.jdt.core/2655170954.index index 73d818f..602a5d4 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2655170954.index and b/.metadata/.plugins/org.eclipse.jdt.core/2655170954.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2769879155.index b/.metadata/.plugins/org.eclipse.jdt.core/2769879155.index deleted file mode 100644 index 96f8b44..0000000 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2769879155.index and /dev/null differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2817101718.index b/.metadata/.plugins/org.eclipse.jdt.core/2817101718.index index 35d263a..f678410 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2817101718.index and b/.metadata/.plugins/org.eclipse.jdt.core/2817101718.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2890245412.index b/.metadata/.plugins/org.eclipse.jdt.core/2890245412.index index 149bcab..e4379fb 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2890245412.index and b/.metadata/.plugins/org.eclipse.jdt.core/2890245412.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2891161224.index b/.metadata/.plugins/org.eclipse.jdt.core/2891161224.index index 3838d82..32bdcac 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/2891161224.index and b/.metadata/.plugins/org.eclipse.jdt.core/2891161224.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/289134298.index b/.metadata/.plugins/org.eclipse.jdt.core/289134298.index index d8e3ecc..bc0a26a 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/289134298.index and b/.metadata/.plugins/org.eclipse.jdt.core/289134298.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3135354350.index b/.metadata/.plugins/org.eclipse.jdt.core/3135354350.index index 1930cef..3985c07 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/3135354350.index and b/.metadata/.plugins/org.eclipse.jdt.core/3135354350.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3514612140.index b/.metadata/.plugins/org.eclipse.jdt.core/3514612140.index index 07eae56..f067fbf 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/3514612140.index and b/.metadata/.plugins/org.eclipse.jdt.core/3514612140.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3515611559.index b/.metadata/.plugins/org.eclipse.jdt.core/3515611559.index index 6ee873b..98e3fa9 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/3515611559.index and b/.metadata/.plugins/org.eclipse.jdt.core/3515611559.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3547251881.index b/.metadata/.plugins/org.eclipse.jdt.core/3547251881.index index 76b3265..d354ad3 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/3547251881.index and b/.metadata/.plugins/org.eclipse.jdt.core/3547251881.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3738696963.index b/.metadata/.plugins/org.eclipse.jdt.core/3738696963.index index 6181764..833bbab 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/3738696963.index and b/.metadata/.plugins/org.eclipse.jdt.core/3738696963.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3758865325.index b/.metadata/.plugins/org.eclipse.jdt.core/3758865325.index index 1c2596e..a47db65 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/3758865325.index and b/.metadata/.plugins/org.eclipse.jdt.core/3758865325.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3842019335.index b/.metadata/.plugins/org.eclipse.jdt.core/3842019335.index index 062affa..9fe5e7e 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/3842019335.index and b/.metadata/.plugins/org.eclipse.jdt.core/3842019335.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/4123041097.index b/.metadata/.plugins/org.eclipse.jdt.core/4123041097.index index 44fa652..d805cc1 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/4123041097.index and b/.metadata/.plugins/org.eclipse.jdt.core/4123041097.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/4150628576.index b/.metadata/.plugins/org.eclipse.jdt.core/4150628576.index index 55c483a..3393894 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/4150628576.index and b/.metadata/.plugins/org.eclipse.jdt.core/4150628576.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/4158338144.index b/.metadata/.plugins/org.eclipse.jdt.core/4158338144.index index c41de67..ef61cfd 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/4158338144.index and b/.metadata/.plugins/org.eclipse.jdt.core/4158338144.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/504781245.index b/.metadata/.plugins/org.eclipse.jdt.core/504781245.index index c627afb..b345b66 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/504781245.index and b/.metadata/.plugins/org.eclipse.jdt.core/504781245.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/721517855.index b/.metadata/.plugins/org.eclipse.jdt.core/721517855.index index 6f4b152..0ce14b7 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/721517855.index and b/.metadata/.plugins/org.eclipse.jdt.core/721517855.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/836499050.index b/.metadata/.plugins/org.eclipse.jdt.core/836499050.index index acd2131..377c8ec 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/836499050.index and b/.metadata/.plugins/org.eclipse.jdt.core/836499050.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/89143789.index b/.metadata/.plugins/org.eclipse.jdt.core/89143789.index index ae02b50..4b68cca 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/89143789.index and b/.metadata/.plugins/org.eclipse.jdt.core/89143789.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/970087405.index b/.metadata/.plugins/org.eclipse.jdt.core/970087405.index index 31cc5e2..c4549ec 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/970087405.index and b/.metadata/.plugins/org.eclipse.jdt.core/970087405.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/997772539.index b/.metadata/.plugins/org.eclipse.jdt.core/997772539.index index 26405c5..8fc5059 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/997772539.index and b/.metadata/.plugins/org.eclipse.jdt.core/997772539.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/externalFilesCache b/.metadata/.plugins/org.eclipse.jdt.core/externalFilesCache index 90ff561..9e45610 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/externalFilesCache and b/.metadata/.plugins/org.eclipse.jdt.core/externalFilesCache differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps b/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps index 8274170..20979d6 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps and b/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache b/.metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache index 7712708..b11ed97 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache and b/.metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt b/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt index f03589b..e73b88c 100644 --- a/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt +++ b/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt @@ -1,5 +1,5 @@ INDEX VERSION 1.134+/home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.jdt.core -690321491.index +1256436118.index 1872440599.index 2240786275.index 4150628576.index @@ -8,13 +8,14 @@ INDEX VERSION 1.134+/home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.ec 2982788279.index 2626965509.index 2609856074.index -2769879155.index 4134502745.index 2817101718.index 4158338144.index 519552992.index 2503368578.index 2181028596.index +9341915.index +900586112.index 1453089870.index 2593736024.index 815902026.index @@ -23,6 +24,7 @@ INDEX VERSION 1.134+/home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.ec 96642630.index 2488355463.index 1446719945.index +2721734530.index 1118739196.index 2891161224.index 2047888269.index @@ -43,11 +45,11 @@ INDEX VERSION 1.134+/home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.ec 1732769785.index 2838468603.index 1436262503.index -3662169204.index +2668411497.index 2927822381.index 2398089967.index 225562445.index -2668411497.index +3662169204.index 1295630681.index 3135354350.index 3602551868.index @@ -100,6 +102,6 @@ INDEX VERSION 1.134+/home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.ec 198314732.index 3514612140.index 1324521365.index -2318770678.index 1633924572.index -1256436118.index +2318770678.index +690321491.index diff --git a/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat b/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat index 495f48e..05a0783 100644 Binary files a/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat and b/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat differ diff --git a/.metadata/.plugins/org.eclipse.jdt.launching/.install.xml b/.metadata/.plugins/org.eclipse.jdt.launching/.install.xml index 810f5e9..6fb5b89 100644 --- a/.metadata/.plugins/org.eclipse.jdt.launching/.install.xml +++ b/.metadata/.plugins/org.eclipse.jdt.launching/.install.xml @@ -1,4 +1,4 @@ - + diff --git a/.metadata/.plugins/org.eclipse.jdt.launching/libraryInfos.xml b/.metadata/.plugins/org.eclipse.jdt.launching/libraryInfos.xml index 455327d..141c448 100644 --- a/.metadata/.plugins/org.eclipse.jdt.launching/libraryInfos.xml +++ b/.metadata/.plugins/org.eclipse.jdt.launching/libraryInfos.xml @@ -1,27 +1,27 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml b/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml index 8dc94c0..aa528d4 100644 --- a/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml +++ b/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml @@ -1,4 +1,5 @@ + diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml b/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml index 1508179..37c217c 100644 --- a/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml +++ b/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml @@ -7,11 +7,15 @@ - + + + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml b/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml index 72ec3c8..271e066 100644 --- a/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml +++ b/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml @@ -6,7 +6,7 @@ - +
@@ -58,4 +58,14 @@ +
+ + + + + +
+
+ +
diff --git a/.metadata/.plugins/org.eclipse.m2e.logback/0.log b/.metadata/.plugins/org.eclipse.m2e.logback/0.log index ba85f04..954fdb4 100644 --- a/.metadata/.plugins/org.eclipse.m2e.logback/0.log +++ b/.metadata/.plugins/org.eclipse.m2e.logback/0.log @@ -17,3 +17,6 @@ 2026-03-16 08:15:37,891 [Worker-7: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. 2026-03-16 19:25:54,797 [Worker-7: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is out-of-date. Trying to update. 2026-03-16 20:07:45,547 [Worker-7: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. +2026-03-17 07:10:24,915 [Worker-7: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. +2026-03-17 19:39:55,931 [Worker-1: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is out-of-date. Trying to update. +2026-03-17 19:49:51,508 [Worker-2: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. diff --git a/.metadata/version.ini b/.metadata/version.ini index 80aab4f..0e1fe94 100644 --- a/.metadata/version.ini +++ b/.metadata/version.ini @@ -1,3 +1,3 @@ -#Mon Mar 16 20:07:41 CET 2026 +#Tue Mar 17 19:49:49 CET 2026 org.eclipse.core.runtime=2 org.eclipse.platform=4.39.0.v20260226-0420 diff --git a/xxxthegame/build.gradle.kts b/xxxthegame/build.gradle.kts index 8a04e09..e9ea300 100644 --- a/xxxthegame/build.gradle.kts +++ b/xxxthegame/build.gradle.kts @@ -18,6 +18,10 @@ repositories { } dependencies { + compileOnly("org.projectlombok:lombok") + annotationProcessor("org.projectlombok:lombok") + testCompileOnly("org.projectlombok:lombok") + testAnnotationProcessor("org.projectlombok:lombok") implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-security") diff --git a/xxxthegame/src/main/java/de/oaa/xxx/XxxThegameApplication.java b/xxxthegame/src/main/java/de/oaa/xxx/XxxThegameApplication.java index 346ee13..a2ddc34 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/XxxThegameApplication.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/XxxThegameApplication.java @@ -2,8 +2,10 @@ package de.oaa.xxx; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication +@EnableScheduling public class XxxThegameApplication { public static void main(String[] args) { diff --git a/xxxthegame/src/main/java/de/oaa/xxx/config/SecurityConfig.java b/xxxthegame/src/main/java/de/oaa/xxx/config/SecurityConfig.java index 35022f3..a401bd9 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/config/SecurityConfig.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/config/SecurityConfig.java @@ -1,5 +1,6 @@ package de.oaa.xxx.config; +import jakarta.servlet.DispatcherType; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; @@ -30,6 +31,7 @@ public class SecurityConfig { .authenticationEntryPoint((request, response, authException) -> response.sendRedirect("/login.html"))) .authorizeHttpRequests(auth -> auth + .dispatcherTypeMatchers(DispatcherType.ASYNC, DispatcherType.ERROR).permitAll() .requestMatchers(AntPathRequestMatcher.antMatcher("/")).permitAll() .requestMatchers(AntPathRequestMatcher.antMatcher("/error")).permitAll() .requestMatchers(AntPathRequestMatcher.antMatcher("/userhome.html")).authenticated() @@ -43,7 +45,8 @@ public class SecurityConfig { .requestMatchers(AntPathRequestMatcher.antMatcher("/sessionvanilla.html")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/sessionbdsm.html")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/sessionchastity.html")).authenticated() - .requestMatchers(AntPathRequestMatcher.antMatcher("/sessionchastityingame.html")).authenticated() + .requestMatchers(AntPathRequestMatcher.antMatcher("/neulock.html")).authenticated() + .requestMatchers(AntPathRequestMatcher.antMatcher("/activelock.html")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/sessionbdsmtasks.html")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/sessionbdsmtoys.html")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/sessionbdsmingame.html")).authenticated() @@ -57,15 +60,20 @@ public class SecurityConfig { .requestMatchers(AntPathRequestMatcher.antMatcher("/communityvotes.html")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/keyholder.html")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/meine-locks.html")).authenticated() + .requestMatchers(AntPathRequestMatcher.antMatcher("/unlock-history.html")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/einladungen.html")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/joinlock.html")).authenticated() + .requestMatchers(AntPathRequestMatcher.antMatcher("/benachrichtigungen.html")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/gruppen/**")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/feed/**")).authenticated() + .requestMatchers(AntPathRequestMatcher.antMatcher("/notifications/**")).authenticated() + .requestMatchers(AntPathRequestMatcher.antMatcher("/events/**")).authenticated() .requestMatchers(AntPathRequestMatcher.antMatcher("/*.html")).permitAll() .requestMatchers(AntPathRequestMatcher.antMatcher("/css/**")).permitAll() .requestMatchers(AntPathRequestMatcher.antMatcher("/js/**")).permitAll() .requestMatchers(AntPathRequestMatcher.antMatcher("/images/**")).permitAll() .requestMatchers(AntPathRequestMatcher.antMatcher("/favicon.ico")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/audio/**")).permitAll() .requestMatchers(AntPathRequestMatcher.antMatcher("/*.png")).permitAll() .requestMatchers(AntPathRequestMatcher.antMatcher("/*.jpg")).permitAll() .requestMatchers(AntPathRequestMatcher.antMatcher("/*.svg")).permitAll() diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/LockeeInvitationController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/LockeeInvitationController.java index 81bf804..ee87f07 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/LockeeInvitationController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/LockeeInvitationController.java @@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import de.oaa.xxx.games.chastity.cardlock.CardlockRepository; +import de.oaa.xxx.social.SseService; import de.oaa.xxx.social.entity.MessageEntity; import de.oaa.xxx.social.repository.MessageRepository; import de.oaa.xxx.user.UserRepository; @@ -34,6 +35,7 @@ public class LockeeInvitationController { private final CardlockRepository cardlockRepository; private final UserRepository userRepository; private final MessageRepository messageRepository; + private final SseService sseService; @Value("${app.base-url:http://localhost:8080}") private String baseUrl; @@ -43,11 +45,27 @@ public class LockeeInvitationController { public LockeeInvitationController(LockeeInvitationRepository lockeeInvitationRepository, CardlockRepository cardlockRepository, UserRepository userRepository, - MessageRepository messageRepository) { + MessageRepository messageRepository, + SseService sseService) { this.lockeeInvitationRepository = lockeeInvitationRepository; this.cardlockRepository = cardlockRepository; this.userRepository = userRepository; this.messageRepository = messageRepository; + this.sseService = sseService; + } + + private void sendMessage(UUID senderId, UUID receiverId, String text, String targetUrl) { + MessageEntity msg = new MessageEntity(); + msg.setMessageId(UUID.randomUUID()); + msg.setSenderId(senderId); + msg.setReceiverId(receiverId); + msg.setText(text); + msg.setSentAt(LocalDateTime.now()); + msg.setSystemMessage(true); + if (targetUrl != null) msg.setTargetUrl(targetUrl); + messageRepository.save(msg); + long unread = messageRepository.countByReceiverIdAndSystemMessageAndReadAtIsNull(receiverId, true); + sseService.push(receiverId, "NOTIFICATION", java.util.Map.of("unreadCount", unread, "text", text)); } private String generateUnlockCode(int lines) { @@ -134,13 +152,9 @@ public class LockeeInvitationController { var lock = lockOpt.get(); cardlockRepository.delete(lock); String lockName = lock.getName() != null && !lock.getName().isBlank() ? lock.getName() : "Unbenanntes Lock"; - MessageEntity msg = new MessageEntity(); - msg.setMessageId(UUID.randomUUID()); - msg.setSenderId(myId); - msg.setReceiverId(inv.getLockeeUserId()); - msg.setText(me.getName() + " hat die Lockee-Einladung für das Lock „" + lockName + "\" zurückgezogen."); - msg.setSentAt(LocalDateTime.now()); - messageRepository.save(msg); + sendMessage(myId, inv.getLockeeUserId(), + me.getName() + " hat die Lockee-Einladung für das Lock „" + lockName + "\" zurückgezogen.", + null); } return ResponseEntity.noContent().build(); @@ -232,14 +246,9 @@ public class LockeeInvitationController { lockeeInvitationRepository.delete(inv); String lockName = lock.getName() != null && !lock.getName().isBlank() ? lock.getName() : "Unbenanntes Lock"; - MessageEntity msg = new MessageEntity(); - msg.setMessageId(UUID.randomUUID()); - msg.setSenderId(myId); - msg.setReceiverId(inv.getKeyholderUserId()); - msg.setText(me.getName() + " hat die Einladung als Lockee für das Lock „" + lockName + "\" angenommen.\n\n" + - "Deine Keyholder-Seite: " + baseUrl + "/keyholder.html"); - msg.setSentAt(now); - messageRepository.save(msg); + sendMessage(myId, inv.getKeyholderUserId(), + me.getName() + " hat die Einladung als Lockee für das Lock „" + lockName + "\" angenommen.", + "/keyholder.html"); return ResponseEntity.ok(Map.of( "lockId", lock.getLockId().toString(), @@ -267,13 +276,9 @@ public class LockeeInvitationController { var lock = lockOpt.get(); cardlockRepository.delete(lock); String lockName = lock.getName() != null && !lock.getName().isBlank() ? lock.getName() : "Unbenanntes Lock"; - MessageEntity msg = new MessageEntity(); - msg.setMessageId(UUID.randomUUID()); - msg.setSenderId(myId); - msg.setReceiverId(inv.getKeyholderUserId()); - msg.setText(me.getName() + " hat die Einladung als Lockee für das Lock „" + lockName + "\" abgelehnt."); - msg.setSentAt(LocalDateTime.now()); - messageRepository.save(msg); + sendMessage(myId, inv.getKeyholderUserId(), + me.getName() + " hat die Einladung als Lockee für das Lock „" + lockName + "\" abgelehnt.", + null); } return ResponseEntity.noContent().build(); diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/Card.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/Card.java index 6b7db49..9f7aac5 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/Card.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/Card.java @@ -1,7 +1,5 @@ package de.oaa.xxx.games.chastity.cardlock; -import de.oaa.xxx.games.chastity.CardLockService; - public interface Card { public CardDTO processCard(CardLockService lock); diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockController.java index ae20d3d..024a9f1 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockController.java @@ -1,27 +1,5 @@ package de.oaa.xxx.games.chastity.cardlock; -import de.oaa.xxx.games.chastity.CardLockService; -import de.oaa.xxx.games.chastity.KeyholderInvitationEntity; -import de.oaa.xxx.games.chastity.KeyholderInvitationRepository; -import de.oaa.xxx.games.chastity.LockeeInvitationEntity; -import de.oaa.xxx.games.chastity.LockeeInvitationRepository; -import de.oaa.xxx.games.chastity.tasks.Task; -import de.oaa.xxx.games.chastity.verification.VerificationRepository; -import de.oaa.xxx.games.chastity.verification.VerificationVoteEntity; -import de.oaa.xxx.games.chastity.verification.VerificationVoteRepository; -import de.oaa.xxx.games.chastity.CodeCreator; -import de.oaa.xxx.games.chastity.verification.VerificationEntity; -import de.oaa.xxx.social.entity.MessageEntity; -import de.oaa.xxx.social.repository.MessageRepository; -import de.oaa.xxx.user.UserRepository; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.imageio.ImageIO; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; @@ -42,6 +20,39 @@ import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; +import javax.imageio.ImageIO; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import de.oaa.xxx.games.chastity.CodeCreator; +import de.oaa.xxx.games.chastity.KeyholderInvitationEntity; +import de.oaa.xxx.games.chastity.KeyholderInvitationRepository; +import de.oaa.xxx.games.chastity.LockeeInvitationEntity; +import de.oaa.xxx.games.chastity.LockeeInvitationRepository; +import de.oaa.xxx.games.chastity.tasks.AssignedTaskEntity; +import de.oaa.xxx.games.chastity.tasks.AssignedTaskRepository; +import de.oaa.xxx.games.chastity.tasks.Task; +import de.oaa.xxx.games.chastity.verification.VerificationEntity; +import de.oaa.xxx.games.chastity.verification.VerificationRepository; +import de.oaa.xxx.games.chastity.verification.VerificationVoteEntity; +import de.oaa.xxx.games.chastity.verification.VerificationVoteRepository; +import de.oaa.xxx.social.SseService; +import de.oaa.xxx.social.entity.MessageEntity; +import de.oaa.xxx.social.repository.MessageRepository; +import de.oaa.xxx.user.UserRepository; + @RestController @RequestMapping("/keyholder") public class CardLockController { @@ -55,6 +66,11 @@ public class CardLockController { private final HygieneViolationRepository hygieneViolationRepository; private final MessageRepository messageRepository; private final LockeeInvitationRepository lockeeInvitationRepository; + private final AssignedTaskRepository assignedTaskRepository; + private final KeyholderTaskChoiceRepository keyholderTaskChoiceRepository; + private final CommunityTaskVoteRepository communityTaskVoteRepository; + private final UnlockCodeHistoryRepository unlockCodeHistoryRepository; + private final SseService sseService; @Value("${app.base-url:http://localhost:8080}") private String baseUrl; @@ -67,16 +83,26 @@ public class CardLockController { VerificationVoteRepository verificationVoteRepository, HygieneViolationRepository hygieneViolationRepository, MessageRepository messageRepository, - LockeeInvitationRepository lockeeInvitationRepository) { - this.cardlockRepository = cardlockRepository; - this.cardLockRepository = cardLockRepository; - this.userRepository = userRepository; - this.invitationRepository = invitationRepository; - this.verificationRepository = verificationRepository; - this.verificationVoteRepository = verificationVoteRepository; - this.hygieneViolationRepository = hygieneViolationRepository; - this.messageRepository = messageRepository; - this.lockeeInvitationRepository = lockeeInvitationRepository; + LockeeInvitationRepository lockeeInvitationRepository, + AssignedTaskRepository assignedTaskRepository, + KeyholderTaskChoiceRepository keyholderTaskChoiceRepository, + CommunityTaskVoteRepository communityTaskVoteRepository, + UnlockCodeHistoryRepository unlockCodeHistoryRepository, + SseService sseService) { + this.cardlockRepository = cardlockRepository; + this.cardLockRepository = cardLockRepository; + this.userRepository = userRepository; + this.invitationRepository = invitationRepository; + this.verificationRepository = verificationRepository; + this.verificationVoteRepository = verificationVoteRepository; + this.hygieneViolationRepository = hygieneViolationRepository; + this.messageRepository = messageRepository; + this.lockeeInvitationRepository = lockeeInvitationRepository; + this.assignedTaskRepository = assignedTaskRepository; + this.keyholderTaskChoiceRepository = keyholderTaskChoiceRepository; + this.communityTaskVoteRepository = communityTaskVoteRepository; + this.unlockCodeHistoryRepository = unlockCodeHistoryRepository; + this.sseService = sseService; } record CreateCardLockRequest( @@ -94,7 +120,8 @@ public class CardLockController { List tasks, boolean requiresVerification, boolean testLock, - Integer unlockCodeLines + Integer unlockCodeLines, + String taskCardMode ) {} private static final SecureRandom RNG = new SecureRandom(); @@ -143,6 +170,7 @@ public class CardLockController { lock.setTasks(req.tasks() != null ? req.tasks() : List.of()); lock.setRequiresVerification(req.requiresVerification()); lock.setTestLock(false); + lock.setTaskCardMode(req.taskCardMode() != null ? req.taskCardMode() : "RANDOM"); // startTime, unlockCode, unlockCodeLines left null until lockee accepts cardlockRepository.save(lock); @@ -157,14 +185,9 @@ public class CardLockController { lockeeInvitationRepository.save(inv); String lockName = req.name() != null && !req.name().isBlank() ? req.name() : "Unbenanntes Lock"; - MessageEntity msg = new MessageEntity(); - msg.setMessageId(UUID.randomUUID()); - msg.setSenderId(myId); - msg.setReceiverId(lockee.getUserId()); - msg.setText(me.getName() + " hat dich als Lockee für das Lock „" + lockName + "\" eingeladen.\n\n" + - "Deine Einladungen findest du hier: " + baseUrl + "/einladungen.html"); - msg.setSentAt(now); - messageRepository.save(msg); + sendMessage(myId, lockee.getUserId(), + me.getName() + " hat dich als Lockee für das Lock „" + lockName + "\" eingeladen.", + "/einladungen.html"); return ResponseEntity.ok(Map.of( "lockId", lock.getLockId().toString(), @@ -194,6 +217,7 @@ public class CardLockController { lock.setTasks(req.tasks() != null ? req.tasks() : List.of()); lock.setRequiresVerification(req.requiresVerification()); lock.setTestLock(req.testLock()); + lock.setTaskCardMode(req.taskCardMode() != null ? req.taskCardMode() : "RANDOM"); lock.setUnlockCodeLines(codeLines); lock.setUnlockCode(unlockCode); @@ -224,15 +248,9 @@ public class CardLockController { invitationRepository.save(inv); String lockName = req.name() != null && !req.name().isBlank() ? req.name() : "Unbenanntes Lock"; - - MessageEntity msg = new MessageEntity(); - msg.setMessageId(UUID.randomUUID()); - msg.setSenderId(me.getUserId()); - msg.setReceiverId(kh.getUserId()); - msg.setText(me.getName() + " hat dich als Keyholder*In für das Lock „" + lockName + "\" eingeladen.\n\n" + - "Deine Einladungen findest du hier: " + baseUrl + "/einladungen.html"); - msg.setSentAt(now); - messageRepository.save(msg); + sendMessage(me.getUserId(), kh.getUserId(), + me.getName() + " hat dich als Keyholder*In für das Lock „" + lockName + "\" eingeladen.", + "/einladungen.html"); keyholderPending = true; } @@ -261,9 +279,45 @@ public class CardLockController { CardDTO dto = service.getNextCard(); if (dto == null) return ResponseEntity.status(409).body(Map.of("error", "Keine Karte verfügbar")); + // Task-Karte in nicht-zufälligem Modus → Entscheidung delegieren + String taskPending = null; + if (dto.card() == CardEnum.TASK && !"RANDOM".equals(l.getTaskCardMode()) + && l.getTasks() != null && !l.getTasks().isEmpty()) { + + if ("KEYHOLDER".equals(l.getTaskCardMode()) && l.getKeyholder() != null) { + KeyholderTaskChoiceEntity choice = new KeyholderTaskChoiceEntity(); + choice.setLockId(l.getLockId()); + choice.setCreatedAt(LocalDateTime.now()); + choice.setStatus("PENDING"); + keyholderTaskChoiceRepository.save(choice); + userRepository.findById(l.getKeyholder()).ifPresent(kh -> + sendMessage(l.getLockee(), kh.getUserId(), + "Deine Lockee hat eine Aufgaben-Karte gezogen – wähle eine Aufgabe aus.", + "/keyholder.html")); + taskPending = "KEYHOLDER"; + + } else if ("COMMUNITY".equals(l.getTaskCardMode())) { + CommunityTaskVoteEntity vote = new CommunityTaskVoteEntity(); + vote.setLockId(l.getLockId()); + vote.setCreatedAt(LocalDateTime.now()); + vote.setExpiresAt(LocalDateTime.now().plusHours(1)); + vote.setStatus("ACTIVE"); + vote.setTestLock(l.isTestLock()); + communityTaskVoteRepository.save(vote); + taskPending = l.isTestLock() ? "RANDOM" : "COMMUNITY"; + } + } + Map result = new HashMap<>(); result.put("card", dto.card().name()); result.put("unlockCode", dto.unlockCode() != null ? dto.unlockCode() : ""); + if (taskPending != null) result.put("taskPending", taskPending); + + // Grüne Karte → Entsperrcode-Historie speichern + if (dto.unlockCode() != null && !dto.unlockCode().isBlank()) { + saveUnlockCodeHistory(myId, l.getLockId(), l.getName(), dto.unlockCode(), "GREEN_CARD"); + } + return ResponseEntity.ok(result); } @@ -282,6 +336,8 @@ public class CardLockController { l.setHygineOpeningtime(LocalDateTime.now()); cardlockRepository.save(l); + saveUnlockCodeHistory(myId, l.getLockId(), l.getName(), l.getUnlockCode(), "HYGIENE_OPEN"); + return ResponseEntity.ok(Map.of( "unlockCode", l.getUnlockCode(), "durationMinutes", l.getHygineOpeningDurationMinutes() != null ? l.getHygineOpeningDurationMinutes() : 30 @@ -309,7 +365,11 @@ public class CardLockController { long overtimeMinutes = ChronoUnit.MINUTES.between(dueTime, now); if (l.getKeyholder() == null) { // Self-Lock: 4-fache Überschreitungszeit einfrieren - l.setFrozenUntill(now.plusMinutes(overtimeMinutes * 4)); + if (l.getFrozenUntill() != null) { + l.setFrozenUntill(l.getFrozenUntill().plusMinutes(overtimeMinutes * 4)); + } else { + l.setFrozenUntill(now.plusMinutes(overtimeMinutes * 4)); + } } else { // Keyholder vorhanden: Verletzung protokollieren HygieneViolationEntity violation = new HygieneViolationEntity(); @@ -333,6 +393,8 @@ public class CardLockController { l.setUnlockCode(newCode); cardlockRepository.save(l); + saveUnlockCodeHistory(myId, l.getLockId(), l.getName(), newCode, "HYGIENE_CLOSE"); + return ResponseEntity.ok(Map.of("newUnlockCode", newCode)); } @@ -422,8 +484,10 @@ public class CardLockController { result.put("totalCards", totalCards); result.put("openPicks", l.getOpenPicks() != null ? l.getOpenPicks() : 0); result.put("nextCardIn", l.getNextCardIn() != null ? l.getNextCardIn().toString() : ""); - result.put("frozenUntill", l.getFrozenUntill() != null ? l.getFrozenUntill().toString() : null); - result.put("currentTask", l.getCurrentTask() != null ? l.getCurrentTask() : null); + result.put("frozenUntill", l.getFrozenUntill() != null ? l.getFrozenUntill().toString() : null); + result.put("currentTask", l.getCurrentTask() != null ? l.getCurrentTask() : null); + result.put("currentTaskDescription", l.getCurrentTaskDescription()); + result.put("taskFrozenUntil", l.getTaskFrozenUntil() != null ? l.getTaskFrozenUntil().toString() : null); result.put("hygieneEnabled", hygieneEnabled); result.put("hygieneOpeningDue", hygieneOpeningDue); result.put("hygieneSecondsRemaining", hygieneSecondsRemaining); @@ -475,6 +539,79 @@ public class CardLockController { result.put("verificationPendingId", verificationPendingId); result.put("verificationPendingCode", verificationPendingCode); + // Abgelaufene Aufgaben prüfen und Strafe anwenden + boolean lockDirty = false; + var expiredTasks = assignedTaskRepository.findByLockIdAndStatus(l.getLockId(), "PENDING") + .stream().filter(t -> t.getAcceptDeadline().isBefore(LocalDateTime.now())).toList(); + for (var t : expiredTasks) { + t.setStatus("EXPIRED"); + applyAssignedTaskPenalty(l, t); + assignedTaskRepository.save(t); + lockDirty = true; + sendMessage(l.getKeyholder(), l.getLockee(), + "Die dir gestellte Aufgabe ist abgelaufen, ohne dass du reagiert hast. Die Strafe wurde automatisch angewendet.", + "/activelock.html?lockId=" + l.getLockId()); + } + if (lockDirty) cardlockRepository.save(l); + + // Ausstehende Keyholder-Aufgaben (ohne Aufgabentext) + var pendingAssigned = assignedTaskRepository.findByLockIdAndStatus(l.getLockId(), "PENDING") + .stream() + .filter(t -> t.getAcceptDeadline().isAfter(LocalDateTime.now())) + .map(t -> { + Map m = new LinkedHashMap<>(); + m.put("taskId", t.getTaskId().toString()); + m.put("taskTitle", t.getTaskTitle() != null ? t.getTaskTitle() : t.getTaskText()); + m.put("taskDescription", t.getTaskDescription() != null ? t.getTaskDescription() : ""); + m.put("taskMinutes", t.getTaskMinutes() != null ? t.getTaskMinutes() : 0); + m.put("assignedAt", t.getAssignedAt().toString()); + m.put("acceptDeadline", t.getAcceptDeadline().toString()); + m.put("penaltyFreezeMinutes", t.getPenaltyFreezeMinutes() != null ? t.getPenaltyFreezeMinutes() : 0); + m.put("penaltyRedCards", t.getPenaltyRedCards() != null ? t.getPenaltyRedCards() : 0); + return m; + }) + .toList(); + result.put("assignedTasks", pendingAssigned); + result.put("taskCardMode", l.getTaskCardMode()); + + // Ausstehende Keyholder-Choices + boolean pendingKeyholderChoice = !keyholderTaskChoiceRepository + .findByLockIdAndStatus(l.getLockId(), "PENDING").isEmpty(); + result.put("pendingKeyholderChoice", pendingKeyholderChoice); + + // Aktive Community-Vote + var activeVotes = communityTaskVoteRepository.findByStatus("ACTIVE").stream() + .filter(v -> v.getLockId().equals(l.getLockId())).findFirst(); + if (activeVotes.isPresent()) { + var v = activeVotes.get(); + result.put("activeCommunityVote", Map.of( + "voteSessionId", v.getVoteSessionId().toString(), + "expiresAt", v.getExpiresAt().toString() + )); + } + + // Notfall-Entsperrung: nach 1 Stunde automatisch öffnen + if (l.getEmergencyUnlockRequestedAt() != null + && !l.isKeyholderRequestedUnlock() + && l.getEmergencyUnlockRequestedAt().isBefore(LocalDateTime.now().minusHours(1))) { + l.setEmergencyAutoUnlocked(true); + l.setKeyholderRequestedUnlock(true); + cardlockRepository.save(l); + } + + // Keyholder hat Unlock angefordert → Unlock-Code mitliefern + result.put("keyholderRequestedUnlock", l.isKeyholderRequestedUnlock()); + if (l.isKeyholderRequestedUnlock()) { + result.put("unlockCode", l.getUnlockCode() != null ? l.getUnlockCode() : ""); + saveUnlockCodeHistory(myId, l.getLockId(), l.getName(), l.getUnlockCode(), "KEYHOLDER_UNLOCK"); + } + + result.put("testLock", l.isTestLock()); + result.put("emergencyUnlockRequested", l.getEmergencyUnlockRequestedAt() != null); + if (l.isTestLock()) { + result.put("unlockCode", l.getUnlockCode() != null ? l.getUnlockCode() : ""); + } + return ResponseEntity.ok(result); } @@ -643,6 +780,7 @@ public class CardLockController { msg.setReceiverId(lock.getLockee()); msg.setText(me.getName() + " hat die Einladung als Keyholder*In für das Lock „" + lockName + "\" abgelehnt."); msg.setSentAt(LocalDateTime.now()); + msg.setSystemMessage(true); messageRepository.save(msg); } @@ -704,6 +842,7 @@ public class CardLockController { msg.setReceiverId(inv.getKeyholderUserId()); msg.setText(me.getName() + " hat die Keyholder-Einladung für das Lock „" + lockName + "\" zurückgezogen."); msg.setSentAt(LocalDateTime.now()); + msg.setSystemMessage(true); messageRepository.save(msg); return ResponseEntity.noContent().build(); @@ -727,8 +866,12 @@ public class CardLockController { item.put("lockeeName", lockee.getName()); item.put("lockeeId", lockee.getUserId().toString()); item.put("lockeeProfilePic", lockee.getProfilePicture()); - item.put("totalCards", lock.getAvailableCards() != null ? lock.getAvailableCards().size() : 0); - item.put("startTime", lock.getStartTime() != null ? lock.getStartTime().toString() : null); + item.put("totalCards", lock.getAvailableCards() != null ? lock.getAvailableCards().size() : 0); + item.put("startTime", lock.getStartTime() != null ? lock.getStartTime().toString() : null); + boolean frozenByKh = lock.getFrozenUntill() != null + && lock.getFrozenUntill().isAfter(LocalDateTime.now()) + && (lock.getCurrentTask() == null || lock.getCurrentTask().isBlank()); + item.put("isFrozenByKeyholder", frozenByKh); result.add(item); } return ResponseEntity.ok(result); @@ -811,7 +954,11 @@ public class CardLockController { result.put("openPicks", l.getOpenPicks() != null ? l.getOpenPicks() : 0); result.put("nextCardIn", l.getNextCardIn() != null ? l.getNextCardIn().toString() : null); result.put("frozenUntill", l.getFrozenUntill() != null ? l.getFrozenUntill().toString() : null); + result.put("taskFrozenUntil", l.getTaskFrozenUntil() != null ? l.getTaskFrozenUntil().toString() : null); + boolean isFrozenByKeyholder = l.getFrozenUntill() != null && l.getFrozenUntill().isAfter(LocalDateTime.now()); + result.put("isFrozenByKeyholder", isFrozenByKeyholder); result.put("currentTask", l.getCurrentTask()); + result.put("currentTaskDescription", l.getCurrentTaskDescription()); result.put("startTime", l.getStartTime() != null ? l.getStartTime().toString() : null); result.put("hygieneEnabled", hygieneEnabled); result.put("hygieneOpeningDue", hygieneOpeningDue); @@ -827,6 +974,66 @@ public class CardLockController { result.put("verificationDownvotes", verificationDownvotes); result.put("hygieneViolations", recentViolations); result.put("hasTasks", l.getTasks() != null && !l.getTasks().isEmpty()); + if (l.getTasks() != null) { + var taskList = l.getTasks().stream() + .map(t -> { + Map m = new LinkedHashMap<>(); + m.put("title", t.resolveTitle()); + m.put("description", t.getDescription() != null ? t.getDescription() : ""); + m.put("minutes", t.getMinutes() != null ? t.getMinutes() : 0); + return m; + }) + .toList(); + result.put("taskList", taskList); + } else { + result.put("taskList", List.of()); + } + var pendingAssigned = assignedTaskRepository.findByLockIdAndStatus(lockId, "PENDING") + .stream() + .filter(t -> t.getAcceptDeadline().isAfter(LocalDateTime.now())) + .map(t -> { + Map m = new LinkedHashMap<>(); + m.put("taskId", t.getTaskId().toString()); + m.put("taskTitle", t.getTaskTitle() != null ? t.getTaskTitle() : t.getTaskText()); + m.put("taskDescription", t.getTaskDescription() != null ? t.getTaskDescription() : ""); + m.put("taskMinutes", t.getTaskMinutes() != null ? t.getTaskMinutes() : 0); + m.put("assignedAt", t.getAssignedAt().toString()); + m.put("acceptDeadline", t.getAcceptDeadline().toString()); + m.put("penaltyFreezeMinutes", t.getPenaltyFreezeMinutes() != null ? t.getPenaltyFreezeMinutes() : 0); + m.put("penaltyRedCards", t.getPenaltyRedCards() != null ? t.getPenaltyRedCards() : 0); + return m; + }) + .toList(); + result.put("pendingAssignedTasks", pendingAssigned); + result.put("taskCardMode", l.getTaskCardMode()); + + // Ausstehende Task-Karten-Choices (KEYHOLDER-Modus) + List lockTasks = l.getTasks() != null ? l.getTasks() : List.of(); + List> taskListForChoice = new ArrayList<>(); + for (int i = 0; i < lockTasks.size(); i++) { + Task t = lockTasks.get(i); + Map tm = new LinkedHashMap<>(); + tm.put("index", i); + tm.put("title", t.resolveTitle()); + tm.put("description", t.getDescription() != null ? t.getDescription() : ""); + tm.put("minutes", t.getMinutes() != null ? t.getMinutes() : 0); + taskListForChoice.add(tm); + } + var pendingChoices = keyholderTaskChoiceRepository.findByLockIdAndStatus(lockId, "PENDING") + .stream() + .map(c -> { + Map cm = new LinkedHashMap<>(); + cm.put("choiceId", c.getChoiceId().toString()); + cm.put("createdAt", c.getCreatedAt().toString()); + cm.put("tasks", taskListForChoice); + return cm; + }) + .toList(); + result.put("pendingTaskChoices", pendingChoices); + result.put("keyholderRequestedUnlock", l.isKeyholderRequestedUnlock()); + result.put("emergencyUnlockRequested", l.getEmergencyUnlockRequestedAt() != null); + result.put("emergencyUnlockRequestedAt", l.getEmergencyUnlockRequestedAt() != null ? l.getEmergencyUnlockRequestedAt().toString() : null); + return ResponseEntity.ok(result); } @@ -899,6 +1106,7 @@ public class CardLockController { msg.setReceiverId(l.getLockee()); msg.setText(msgText); msg.setSentAt(LocalDateTime.now()); + msg.setSystemMessage(true); messageRepository.save(msg); return ResponseEntity.noContent().build(); @@ -963,11 +1171,383 @@ public class CardLockController { msg.setReceiverId(l.getLockee()); msg.setText(msgText); msg.setSentAt(LocalDateTime.now()); + msg.setSystemMessage(true); messageRepository.save(msg); return ResponseEntity.noContent().build(); } + // ── Hilfsmethoden ────────────────────────────────────────────────────────── + + private void applyAssignedTaskPenalty(CardLockEntity l, AssignedTaskEntity task) { + if (task.getPenaltyFreezeMinutes() != null && task.getPenaltyFreezeMinutes() > 0) { + LocalDateTime until = LocalDateTime.now().plusMinutes(task.getPenaltyFreezeMinutes()); + // Bestehenden Freeze nur verlängern, nie verkürzen + if (l.getFrozenUntill() == null || until.isAfter(l.getFrozenUntill())) { + l.setFrozenUntill(until); + l.setNextCardIn(until); + } + } + if (task.getPenaltyRedCards() != null && task.getPenaltyRedCards() > 0) { + List cards = new ArrayList<>(l.getAvailableCards() != null ? l.getAvailableCards() : List.of()); + for (int i = 0; i < task.getPenaltyRedCards(); i++) { + cards.add(CardEnum.RED); + } + l.setAvailableCards(cards); + } + } + + private void sendMessage(UUID senderId, UUID receiverId, String text, String targetUrl) { + if (senderId == null || receiverId == null) return; + MessageEntity msg = new MessageEntity(); + msg.setMessageId(UUID.randomUUID()); + msg.setSenderId(senderId); + msg.setReceiverId(receiverId); + msg.setText(text); + msg.setSentAt(LocalDateTime.now()); + msg.setSystemMessage(true); + if (targetUrl != null) msg.setTargetUrl(targetUrl); + messageRepository.save(msg); + long unread = messageRepository.countByReceiverIdAndSystemMessageAndReadAtIsNull(receiverId, true); + sseService.push(receiverId, "NOTIFICATION", java.util.Map.of("unreadCount", unread, "text", text)); + } + + // ── Entsperrcode-Historie ────────────────────────────────────────────────── + + private void saveUnlockCodeHistory(UUID userId, UUID lockId, String lockName, String unlockCode, String source) { + if (unlockCode == null || unlockCode.isBlank()) return; + // Deduplizierung: gleicher Code+Quelle+Lock bereits gespeichert → überspringen + if (unlockCodeHistoryRepository.existsByLockIdAndSourceAndUnlockCode(lockId, source, unlockCode)) return; + UnlockCodeHistoryEntity entry = new UnlockCodeHistoryEntity(); + entry.setUserId(userId); + entry.setLockId(lockId); + entry.setLockName(lockName != null && !lockName.isBlank() ? lockName : "Unbenanntes Lock"); + entry.setUnlockCode(unlockCode); + entry.setSource(source); + entry.setReceivedAt(LocalDateTime.now()); + unlockCodeHistoryRepository.save(entry); + // Nur die letzten 10 behalten + long count = unlockCodeHistoryRepository.countByUserId(userId); + if (count > 10) { + var oldest = unlockCodeHistoryRepository.findByUserIdOrderByReceivedAtAsc(userId); + for (int i = 0; i < count - 10; i++) { + unlockCodeHistoryRepository.delete(oldest.get(i)); + } + } + } + + @GetMapping("/cardlock/unlock-history") + public ResponseEntity>> getUnlockHistory(Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + var entries = unlockCodeHistoryRepository.findByUserIdOrderByReceivedAtDesc(myId, + org.springframework.data.domain.PageRequest.of(0, 10)); + List> result = new ArrayList<>(); + for (var e : entries) { + Map item = new HashMap<>(); + item.put("lockName", e.getLockName()); + item.put("unlockCode", e.getUnlockCode()); + item.put("source", e.getSource()); + item.put("receivedAt", e.getReceivedAt().toString()); + result.add(item); + } + return ResponseEntity.ok(result); + } + + // ── Keyholder: Aufgabe stellen ───────────────────────────────────────────── + + record AssignTaskRequest(int taskIndex, int acceptDeadlineMinutes, + Integer penaltyFreezeMinutes, Integer penaltyRedCards) {} + + @Transactional + @PostMapping("/as-keyholder/{lockId}/assign-task") + public ResponseEntity assignTask(@PathVariable UUID lockId, + @RequestBody AssignTaskRequest req, + Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + var me = meOpt.get(); + + var lockOpt = cardlockRepository.findById(lockId); + if (lockOpt.isEmpty()) return ResponseEntity.notFound().build(); + var l = lockOpt.get(); + if (!me.getUserId().equals(l.getKeyholder())) return ResponseEntity.status(403).build(); + + var tasks = l.getTasks(); + if (tasks == null || tasks.isEmpty()) + return ResponseEntity.badRequest().body(Map.of("error", "Dieses Lock hat keine Aufgaben.")); + if (req.taskIndex() < 0 || req.taskIndex() >= tasks.size()) + return ResponseEntity.badRequest().body(Map.of("error", "Ungültiger Aufgaben-Index.")); + if (req.acceptDeadlineMinutes() < 1) + return ResponseEntity.badRequest().body(Map.of("error", "Die Annahme-Frist muss mindestens 1 Minute betragen.")); + + long pendingCount = assignedTaskRepository.findByLockIdAndStatus(lockId, "PENDING").stream() + .filter(t -> t.getAcceptDeadline().isAfter(LocalDateTime.now())) + .count(); + if (pendingCount >= 5) + return ResponseEntity.badRequest().body(Map.of("error", "Es sind bereits 5 Aufgaben offen. Bitte warte, bis der Lockee eine davon annimmt oder ablehnt.")); + + Task task = tasks.get(req.taskIndex()); + AssignedTaskEntity assigned = new AssignedTaskEntity(); + assigned.setLockId(lockId); + assigned.setTaskTitle(task.resolveTitle()); + assigned.setTaskDescription(task.getDescription()); + assigned.setTaskText(task.resolveTitle()); // Compat + assigned.setTaskMinutes(task.getMinutes()); + assigned.setAssignedAt(LocalDateTime.now()); + assigned.setAcceptDeadline(LocalDateTime.now().plusMinutes(req.acceptDeadlineMinutes())); + assigned.setPenaltyFreezeMinutes(req.penaltyFreezeMinutes()); + assigned.setPenaltyRedCards(req.penaltyRedCards()); + assigned.setStatus("PENDING"); + assignedTaskRepository.save(assigned); + + sendMessage(me.getUserId(), l.getLockee(), + me.getName() + " hat dir eine Aufgabe gestellt. Du hast " + + req.acceptDeadlineMinutes() + " Minuten, um sie anzunehmen.", + "/activelock.html?lockId=" + lockId); + + return ResponseEntity.noContent().build(); + } + + // ── Lockee: Aufgabe annehmen ─────────────────────────────────────────────── + + @Transactional + @PostMapping("/cardlock/{lockId}/assigned-tasks/{taskId}/accept") + public ResponseEntity acceptAssignedTask(@PathVariable UUID lockId, + @PathVariable UUID taskId, + Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + + var lockOpt = cardlockRepository.findById(lockId); + if (lockOpt.isEmpty()) return ResponseEntity.notFound().build(); + var l = lockOpt.get(); + if (!l.getLockee().equals(myId)) return ResponseEntity.status(403).build(); + + var taskOpt = assignedTaskRepository.findById(taskId); + if (taskOpt.isEmpty() || !taskOpt.get().getLockId().equals(lockId)) + return ResponseEntity.notFound().build(); + var task = taskOpt.get(); + if (!"PENDING".equals(task.getStatus())) + return ResponseEntity.status(409).body(Map.of("error", "Diese Aufgabe ist nicht mehr ausstehend.")); + if (task.getAcceptDeadline().isBefore(LocalDateTime.now())) { + // Bereits abgelaufen – Strafe anwenden + task.setStatus("EXPIRED"); + applyAssignedTaskPenalty(l, task); + assignedTaskRepository.save(task); + cardlockRepository.save(l); + return ResponseEntity.status(409).body(Map.of("error", "Die Annahme-Frist ist abgelaufen. Die Strafe wurde angewendet.")); + } + boolean hasActiveTask = (l.getCurrentTask() != null && !l.getCurrentTask().isBlank()) + || (l.getTaskFrozenUntil() != null && l.getTaskFrozenUntil().isAfter(LocalDateTime.now())); + if (hasActiveTask) + return ResponseEntity.status(409).body(Map.of("error", "Du hast bereits eine laufende Aufgabe.")); + + // Aufgabe aktivieren – separater Task-Timer, kein Freeze + String title = task.getTaskTitle() != null ? task.getTaskTitle() : task.getTaskText(); + l.setCurrentTask(title); + l.setCurrentTaskDescription(task.getTaskDescription()); + if (task.getTaskMinutes() != null && task.getTaskMinutes() > 0) { + l.setTaskFrozenUntil(LocalDateTime.now().plusMinutes(task.getTaskMinutes())); + + // Fälligkeit aller anderen offenen Aufgaben um die Task-Dauer verschieben + final int extraMinutes = task.getTaskMinutes(); + assignedTaskRepository.findByLockIdAndStatus(lockId, "PENDING").stream() + .filter(t -> !t.getTaskId().equals(taskId)) + .forEach(t -> { + t.setAcceptDeadline(t.getAcceptDeadline().plusMinutes(extraMinutes)); + assignedTaskRepository.save(t); + }); + } + task.setStatus("ACCEPTED"); + assignedTaskRepository.save(task); + cardlockRepository.save(l); + + sendMessage(myId, l.getKeyholder(), meOpt.get().getName() + " hat die gestellte Aufgabe angenommen.", "/keyholder.html"); + return ResponseEntity.noContent().build(); + } + + // ── Lockee: Aufgabe ablehnen ─────────────────────────────────────────────── + + @Transactional + @PostMapping("/cardlock/{lockId}/assigned-tasks/{taskId}/decline") + public ResponseEntity declineAssignedTask(@PathVariable UUID lockId, + @PathVariable UUID taskId, + Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + + var lockOpt = cardlockRepository.findById(lockId); + if (lockOpt.isEmpty()) return ResponseEntity.notFound().build(); + var l = lockOpt.get(); + if (!l.getLockee().equals(myId)) return ResponseEntity.status(403).build(); + + var taskOpt = assignedTaskRepository.findById(taskId); + if (taskOpt.isEmpty() || !taskOpt.get().getLockId().equals(lockId)) + return ResponseEntity.notFound().build(); + var task = taskOpt.get(); + if (!"PENDING".equals(task.getStatus())) + return ResponseEntity.status(409).body(Map.of("error", "Diese Aufgabe ist nicht mehr ausstehend.")); + + task.setStatus("DECLINED"); + applyAssignedTaskPenalty(l, task); + assignedTaskRepository.save(task); + cardlockRepository.save(l); + + sendMessage(myId, l.getKeyholder(), meOpt.get().getName() + " hat die gestellte Aufgabe abgelehnt. Die Strafe wurde angewendet.", "/keyholder.html"); + return ResponseEntity.noContent().build(); + } + + // ── Keyholder: Aufgabe zurückziehen ─────────────────────────────────────── + + @Transactional + @DeleteMapping("/as-keyholder/{lockId}/assigned-tasks/{taskId}") + public ResponseEntity cancelAssignedTask(@PathVariable UUID lockId, + @PathVariable UUID taskId, + Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + + var lockOpt = cardlockRepository.findById(lockId); + if (lockOpt.isEmpty()) return ResponseEntity.notFound().build(); + var l = lockOpt.get(); + if (!myId.equals(l.getKeyholder())) return ResponseEntity.status(403).build(); + + var taskOpt = assignedTaskRepository.findById(taskId); + if (taskOpt.isEmpty() || !taskOpt.get().getLockId().equals(lockId)) + return ResponseEntity.notFound().build(); + var task = taskOpt.get(); + if (!"PENDING".equals(task.getStatus())) + return ResponseEntity.status(409).body(Map.of("error", "Aufgabe ist nicht mehr ausstehend.")); + + assignedTaskRepository.delete(task); + return ResponseEntity.noContent().build(); + } + + record FreezeRequest(String frozenUntil) {} + + @Transactional + @PostMapping("/as-keyholder/{lockId}/freeze") + public ResponseEntity freezeLock(@PathVariable UUID lockId, + @RequestBody FreezeRequest req, + Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + var me = meOpt.get(); + UUID myId = me.getUserId(); + + var lockOpt = cardlockRepository.findById(lockId); + if (lockOpt.isEmpty()) return ResponseEntity.notFound().build(); + var l = lockOpt.get(); + if (!myId.equals(l.getKeyholder())) return ResponseEntity.status(403).build(); + if (l.getCurrentTask() != null && !l.getCurrentTask().isBlank()) { + return ResponseEntity.badRequest().body(Map.of("error", "Das Lock ist gerade durch eine Aufgabe eingefroren.")); + } + + LocalDateTime until; + try { + until = LocalDateTime.parse(req.frozenUntil()); + } catch (Exception e) { + return ResponseEntity.badRequest().body(Map.of("error", "Ungültiges Datumsformat.")); + } + if (!until.isAfter(LocalDateTime.now())) { + return ResponseEntity.badRequest().body(Map.of("error", "Zeitpunkt muss in der Zukunft liegen.")); + } + + l.setFrozenUntill(until); + cardlockRepository.save(l); + + sendMessage(myId, l.getLockee(), me.getName() + " hat dein Lock bis " + + until.toLocalDate().format(java.time.format.DateTimeFormatter.ofPattern("dd.MM.yyyy")) + + " " + until.toLocalTime().format(java.time.format.DateTimeFormatter.ofPattern("HH:mm")) + + " Uhr eingefroren.", + "/activelock.html?lockId=" + lockId); + + return ResponseEntity.noContent().build(); + } + + @Transactional + @DeleteMapping("/as-keyholder/{lockId}/freeze") + public ResponseEntity unfreezeLock(@PathVariable UUID lockId, Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + var me = meOpt.get(); + UUID myId = me.getUserId(); + + var lockOpt = cardlockRepository.findById(lockId); + if (lockOpt.isEmpty()) return ResponseEntity.notFound().build(); + var l = lockOpt.get(); + if (!myId.equals(l.getKeyholder())) return ResponseEntity.status(403).build(); + if (l.getCurrentTask() != null && !l.getCurrentTask().isBlank()) { + return ResponseEntity.badRequest().body(Map.of("error", "Das Lock ist durch eine Aufgabe eingefroren und kann nicht manuell entfroren werden.")); + } + + l.setFrozenUntill(null); + cardlockRepository.save(l); + + sendMessage(myId, l.getLockee(), me.getName() + " hat dein Lock wieder entfroren.", + "/activelock.html?lockId=" + lockId); + + return ResponseEntity.noContent().build(); + } + + @Transactional + @PostMapping("/as-keyholder/{lockId}/request-unlock") + public ResponseEntity requestUnlock(@PathVariable UUID lockId, Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + + var lockOpt = cardlockRepository.findById(lockId); + if (lockOpt.isEmpty()) return ResponseEntity.notFound().build(); + var l = lockOpt.get(); + if (!myId.equals(l.getKeyholder())) return ResponseEntity.status(403).build(); + + l.setKeyholderRequestedUnlock(true); + cardlockRepository.save(l); + + sendMessage(myId, l.getLockee(), + "Dein Keyholder hat das Lock freigeschaltet. Du erhältst beim nächsten Laden deinen Entsperrcode.", + "/activelock.html?lockId=" + lockId); + + return ResponseEntity.noContent().build(); + } + + @Transactional + @PostMapping("/cardlock/{lockId}/emergency-unlock") + public ResponseEntity requestEmergencyUnlock(@PathVariable UUID lockId, Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + var me = meOpt.get(); + UUID myId = me.getUserId(); + + var lockOpt = cardlockRepository.findById(lockId); + if (lockOpt.isEmpty()) return ResponseEntity.notFound().build(); + var l = lockOpt.get(); + if (!l.getLockee().equals(myId)) return ResponseEntity.status(403).build(); + if (l.isTestLock()) return ResponseEntity.badRequest().build(); + if (l.getEmergencyUnlockRequestedAt() != null) return ResponseEntity.status(409).build(); + + l.setEmergencyUnlockRequestedAt(LocalDateTime.now()); + + if (l.getKeyholder() == null) { + // Self-Lock ohne Keyholderin → sofort öffnen + l.setEmergencyAutoUnlocked(true); + l.setKeyholderRequestedUnlock(true); + } else { + // Keyholderin benachrichtigen + sendMessage(myId, l.getKeyholder(), + "⚠️ NOTFALL: " + me.getName() + " bittet dringend um Freigabe des Locks. Bitte reagiere innerhalb einer Stunde, sonst öffnet sich das Lock automatisch.", + "/keyholder.html"); + } + cardlockRepository.save(l); + return ResponseEntity.noContent().build(); + } + private String cardLabel(CardEnum card) { return switch (card) { case RED -> "Rote Karte"; diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockEntity.java index 5cfef9f..e9a4ff3 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockEntity.java @@ -76,12 +76,32 @@ public class CardLockEntity { private LocalDateTime unlockTime; @Column private String currentTask; + @Column(columnDefinition = "TEXT") + private String currentTaskDescription; + @Column + private LocalDateTime taskFrozenUntil; @Convert(converter = TaskListConverter.class) @Column(columnDefinition = "TEXT") private List tasksInQueue; @Column private String unlockCode; + /** Keyholder hat Unlock angefordert – nächste Aktion der Lockee zeigt grüne Karte */ + @Column(nullable = false) + private boolean keyholderRequestedUnlock = false; + + /** Lockee hat Notfall-Entsperrung angefordert */ + @Column + private java.time.LocalDateTime emergencyUnlockRequestedAt; + + /** true = System hat automatisch entsperrt (Keyholderin nicht reagiert) */ + @Column(nullable = false) + private boolean emergencyAutoUnlocked = false; + + /** RANDOM | KEYHOLDER | COMMUNITY */ + @Column(nullable = false) + private String taskCardMode = "RANDOM"; + public UUID getLockId() { return lockId; } @@ -242,13 +262,14 @@ public class CardLockEntity { this.tasks = tasks; } - public String getCurrentTask() { - return currentTask; - } + public String getCurrentTask() { return currentTask; } + public void setCurrentTask(String currentTask) { this.currentTask = currentTask; } - public void setCurrentTask(String currentTask) { - this.currentTask = currentTask; - } + public String getCurrentTaskDescription() { return currentTaskDescription; } + public void setCurrentTaskDescription(String d) { this.currentTaskDescription = d; } + + public LocalDateTime getTaskFrozenUntil() { return taskFrozenUntil; } + public void setTaskFrozenUntil(LocalDateTime t) { this.taskFrozenUntil = t; } public List getTasksInQueue() { return tasksInQueue; @@ -289,4 +310,16 @@ public class CardLockEntity { public void setUnlockCodeLines(Integer unlockCodeLines) { this.unlockCodeLines = unlockCodeLines; } + + public String getTaskCardMode() { return taskCardMode != null ? taskCardMode : "RANDOM"; } + public void setTaskCardMode(String taskCardMode) { this.taskCardMode = taskCardMode; } + + public boolean isKeyholderRequestedUnlock() { return keyholderRequestedUnlock; } + public void setKeyholderRequestedUnlock(boolean v) { this.keyholderRequestedUnlock = v; } + + public java.time.LocalDateTime getEmergencyUnlockRequestedAt() { return emergencyUnlockRequestedAt; } + public void setEmergencyUnlockRequestedAt(java.time.LocalDateTime t) { this.emergencyUnlockRequestedAt = t; } + + public boolean isEmergencyAutoUnlocked() { return emergencyAutoUnlocked; } + public void setEmergencyAutoUnlocked(boolean v) { this.emergencyAutoUnlocked = v; } } diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/CardLockService.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockService.java similarity index 84% rename from xxxthegame/src/main/java/de/oaa/xxx/games/chastity/CardLockService.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockService.java index 336c8cd..c573ce7 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/CardLockService.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockService.java @@ -1,4 +1,4 @@ -package de.oaa.xxx.games.chastity; +package de.oaa.xxx.games.chastity.cardlock; import java.time.Duration; import java.time.LocalDate; @@ -11,10 +11,7 @@ import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import de.oaa.xxx.games.chastity.cardlock.CardDTO; -import de.oaa.xxx.games.chastity.cardlock.CardEnum; -import de.oaa.xxx.games.chastity.cardlock.CardLockEntity; -import de.oaa.xxx.games.chastity.cardlock.CardLockRepository; +import de.oaa.xxx.games.chastity.ProcessLock; import de.oaa.xxx.games.chastity.tasks.Task; import de.oaa.xxx.games.chastity.verification.VerificationEntity; import de.oaa.xxx.games.chastity.verification.VerificationRepository; @@ -39,7 +36,9 @@ public class CardLockService extends ProcessLock { public CardDTO getNextCard() { LOGGER.debug("New Card requested by user {}", lock.getLockee()); CardDTO card = null; - if (lock.isAccumulatePicks()) { + if (lock.getLatestOpeningtime() != null && lock.getLatestOpeningtime().isAfter(LocalDateTime.now())) { + card = getGreenCard(); + } else if (lock.isAccumulatePicks()) { if (lock.getNextCardIn().isAfter(LocalDateTime.now())) { lock.setOpenPicks(lock.getOpenPicks() == null ? 1 : lock.getOpenPicks() + 1); } @@ -51,8 +50,7 @@ public class CardLockService extends ProcessLock { if (lock.getNextCardIn().isBefore(LocalDateTime.now())) { lock.setNextCardIn(LocalDateTime.now().plusMinutes(lock.getPickEveryMinute())); card = getRandomCard(); - lock.getAvailableCards().remove(card.card()); - } + } } cardLockRepository.save(lock); return card; @@ -67,6 +65,10 @@ public class CardLockService extends ProcessLock { return card.get().processCard(this); } LOGGER.error("Keine Karten mehr im Lock - generiere Notfall Grüne Karte"); + return getGreenCard(); + } + + private CardDTO getGreenCard() { return new CardDTO(CardEnum.GREEN, lock.getUnlockCode()); } @@ -91,7 +93,8 @@ public class CardLockService extends ProcessLock { public void unlock(String unlockCode) { this.lock.setUnlockTime(LocalDateTime.now()); - boolean valid = true; + // Self-Lock oder automatische Entsperrung ohne Keyholder-Zustimmung → ungültig + boolean valid = lock.getKeyholder() != null && !lock.isEmergencyAutoUnlocked(); if (!this.lock.isTestLock()) { if (Duration.between(lock.getStartTime(), lock.getUnlockTime()).toHours() > 24) { Set verifications = verificationRepository.findByLockId(this.lock.getLockId()).stream() @@ -159,6 +162,11 @@ public class CardLockService extends ProcessLock { } public String task() { + // Non-RANDOM modes are handled by the controller after the card is drawn + if (!"RANDOM".equals(lock.getTaskCardMode())) { + LOGGER.debug("Task card drawn in {} mode – skipping random assignment", lock.getTaskCardMode()); + return ""; + } LOGGER.debug("Apply random task"); var tasks = lock.getTasks(); if (!tasks.isEmpty()) { @@ -169,17 +177,19 @@ public class CardLockService extends ProcessLock { public String task(Task task) { LOGGER.debug("Apply task {}", task); - lock.setCurrentTask(task.getText()); - if (task.getMinutes() != null) { - freeze(task.getMinutes()); + lock.setCurrentTask(task.resolveTitle()); + lock.setCurrentTaskDescription(task.getDescription()); + if (task.getMinutes() != null && task.getMinutes() > 0) { + lock.setTaskFrozenUntil(LocalDateTime.now().plusMinutes(task.getMinutes())); } return ""; } public String clearTask() { LOGGER.debug("Clear task"); - lock.setFrozenUntill(null); lock.setCurrentTask(null); + lock.setCurrentTaskDescription(null); + lock.setTaskFrozenUntil(null); return ""; } diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardlockTemplateController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardlockTemplateController.java index c7824ac..3b30448 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardlockTemplateController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardlockTemplateController.java @@ -32,7 +32,8 @@ public class CardlockTemplateController { Integer hygineOpeningDurationMinutes, Integer hygineOpeningEveryMinites, List tasks, - boolean requiresVerification + boolean requiresVerification, + String taskCardMode ) {} private Map toDto(CardlockTemplateEntity t) { @@ -48,6 +49,7 @@ public class CardlockTemplateController { dto.put("hygineOpeningDurationMinutes", t.getHygineOpeningDurationMinutes()); dto.put("tasks", t.getTasks() != null ? t.getTasks() : List.of()); dto.put("requiresVerification", t.isRequiresVerification()); + dto.put("taskCardMode", t.getTaskCardMode()); return dto; } @@ -127,5 +129,6 @@ public class CardlockTemplateController { t.setHygineOpeningDurationMinutes(req.hygineOpeningDurationMinutes()); t.setTasks(req.tasks() != null ? req.tasks() : List.of()); t.setRequiresVerification(req.requiresVerification()); + t.setTaskCardMode(req.taskCardMode() != null ? req.taskCardMode() : "RANDOM"); } } diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardlockTemplateEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardlockTemplateEntity.java index ee024cb..8cc7eaa 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardlockTemplateEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardlockTemplateEntity.java @@ -53,6 +53,9 @@ public class CardlockTemplateEntity { @Column private boolean requiresVerification; + @Column(nullable = false) + private String taskCardMode = "RANDOM"; + public UUID getTemplateId() { return templateId; } public void setTemplateId(UUID templateId) { this.templateId = templateId; } @@ -88,4 +91,7 @@ public class CardlockTemplateEntity { public boolean isRequiresVerification() { return requiresVerification; } public void setRequiresVerification(boolean requiresVerification) { this.requiresVerification = requiresVerification; } + + public String getTaskCardMode() { return taskCardMode != null ? taskCardMode : "RANDOM"; } + public void setTaskCardMode(String taskCardMode) { this.taskCardMode = taskCardMode; } } diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteEntity.java new file mode 100644 index 0000000..0117571 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteEntity.java @@ -0,0 +1,56 @@ +package de.oaa.xxx.games.chastity.cardlock; + +import jakarta.persistence.*; +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +@Table(name = "community_task_vote") +public class CommunityTaskVoteEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID voteSessionId; + + @Column(nullable = false) + private UUID lockId; + + /** ACTIVE | COMPLETED */ + @Column(nullable = false) + private String status = "ACTIVE"; + + @Column(nullable = false) + private LocalDateTime createdAt; + + @Column(nullable = false) + private LocalDateTime expiresAt; + + /** true = TestLock, nicht der Community zeigen */ + @Column(nullable = false) + private boolean testLock = false; + + /** null until completed */ + @Column + private Integer winningTaskIndex; + + public UUID getVoteSessionId() { return voteSessionId; } + public void setVoteSessionId(UUID id) { this.voteSessionId = id; } + + public UUID getLockId() { return lockId; } + public void setLockId(UUID lockId) { this.lockId = lockId; } + + public String getStatus() { return status; } + public void setStatus(String status) { this.status = status; } + + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime t) { this.createdAt = t; } + + public LocalDateTime getExpiresAt() { return expiresAt; } + public void setExpiresAt(LocalDateTime t) { this.expiresAt = t; } + + public boolean isTestLock() { return testLock; } + public void setTestLock(boolean testLock) { this.testLock = testLock; } + + public Integer getWinningTaskIndex() { return winningTaskIndex; } + public void setWinningTaskIndex(Integer i) { this.winningTaskIndex = i; } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteEntryEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteEntryEntity.java new file mode 100644 index 0000000..2745039 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteEntryEntity.java @@ -0,0 +1,35 @@ +package de.oaa.xxx.games.chastity.cardlock; + +import jakarta.persistence.*; +import java.util.UUID; + +@Entity +@Table(name = "community_task_vote_entry", + uniqueConstraints = @UniqueConstraint(columnNames = {"voteSessionId", "voterUserId"})) +public class CommunityTaskVoteEntryEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID entryId; + + @Column(nullable = false) + private UUID voteSessionId; + + @Column(nullable = false) + private UUID voterUserId; + + @Column(nullable = false) + private int taskIndex; + + public UUID getEntryId() { return entryId; } + public void setEntryId(UUID entryId) { this.entryId = entryId; } + + public UUID getVoteSessionId() { return voteSessionId; } + public void setVoteSessionId(UUID id) { this.voteSessionId = id; } + + public UUID getVoterUserId() { return voterUserId; } + public void setVoterUserId(UUID id) { this.voterUserId = id; } + + public int getTaskIndex() { return taskIndex; } + public void setTaskIndex(int taskIndex) { this.taskIndex = taskIndex; } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteEntryRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteEntryRepository.java new file mode 100644 index 0000000..0f8eaf2 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteEntryRepository.java @@ -0,0 +1,11 @@ +package de.oaa.xxx.games.chastity.cardlock; + +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import java.util.UUID; + +public interface CommunityTaskVoteEntryRepository extends JpaRepository { + List findByVoteSessionId(UUID voteSessionId); + boolean existsByVoteSessionIdAndVoterUserId(UUID voteSessionId, UUID voterUserId); + Integer countByVoteSessionIdAndTaskIndex(UUID voteSessionId, int taskIndex); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteRepository.java new file mode 100644 index 0000000..4d1a743 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/CommunityTaskVoteRepository.java @@ -0,0 +1,12 @@ +package de.oaa.xxx.games.chastity.cardlock; + +import org.springframework.data.jpa.repository.JpaRepository; +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +public interface CommunityTaskVoteRepository extends JpaRepository { + List findByStatus(String status); + List findByStatusAndExpiresAtBefore(String status, LocalDateTime time); + boolean existsByLockIdAndStatus(UUID lockId, String status); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/DoubleUpCard.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/DoubleUpCard.java index 6360aa3..e13fc13 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/DoubleUpCard.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/DoubleUpCard.java @@ -1,7 +1,5 @@ package de.oaa.xxx.games.chastity.cardlock; -import de.oaa.xxx.games.chastity.CardLockService; - public class DoubleUpCard implements Card { @Override diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/FreezeCard.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/FreezeCard.java index e45e15a..d311849 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/FreezeCard.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/FreezeCard.java @@ -1,7 +1,5 @@ package de.oaa.xxx.games.chastity.cardlock; -import de.oaa.xxx.games.chastity.CardLockService; - public class FreezeCard implements Card { @Override diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/GreenCard.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/GreenCard.java index 8b4c9e7..007fba8 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/GreenCard.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/GreenCard.java @@ -1,7 +1,5 @@ package de.oaa.xxx.games.chastity.cardlock; -import de.oaa.xxx.games.chastity.CardLockService; - public class GreenCard implements Card { @Override diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/KeyholderTaskChoiceEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/KeyholderTaskChoiceEntity.java new file mode 100644 index 0000000..9f1dcb6 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/KeyholderTaskChoiceEntity.java @@ -0,0 +1,36 @@ +package de.oaa.xxx.games.chastity.cardlock; + +import jakarta.persistence.*; +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +@Table(name = "keyholder_task_choice") +public class KeyholderTaskChoiceEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID choiceId; + + @Column(nullable = false) + private UUID lockId; + + /** PENDING | CHOSEN */ + @Column(nullable = false) + private String status = "PENDING"; + + @Column(nullable = false) + private LocalDateTime createdAt; + + public UUID getChoiceId() { return choiceId; } + public void setChoiceId(UUID choiceId) { this.choiceId = choiceId; } + + public UUID getLockId() { return lockId; } + public void setLockId(UUID lockId) { this.lockId = lockId; } + + public String getStatus() { return status; } + public void setStatus(String status) { this.status = status; } + + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime t) { this.createdAt = t; } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/KeyholderTaskChoiceRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/KeyholderTaskChoiceRepository.java new file mode 100644 index 0000000..9843862 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/KeyholderTaskChoiceRepository.java @@ -0,0 +1,9 @@ +package de.oaa.xxx.games.chastity.cardlock; + +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import java.util.UUID; + +public interface KeyholderTaskChoiceRepository extends JpaRepository { + List findByLockIdAndStatus(UUID lockId, String status); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/RedCard.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/RedCard.java index 06ed9b0..89ac95b 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/RedCard.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/RedCard.java @@ -1,7 +1,5 @@ package de.oaa.xxx.games.chastity.cardlock; -import de.oaa.xxx.games.chastity.CardLockService; - public class RedCard implements Card { @Override diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/ResetCard.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/ResetCard.java index dbfc8d4..33c53aa 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/ResetCard.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/ResetCard.java @@ -1,7 +1,5 @@ package de.oaa.xxx.games.chastity.cardlock; -import de.oaa.xxx.games.chastity.CardLockService; - public class ResetCard implements Card { @Override diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/TaskCard.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/TaskCard.java index d86c253..38173b6 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/TaskCard.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/TaskCard.java @@ -1,7 +1,5 @@ package de.oaa.xxx.games.chastity.cardlock; -import de.oaa.xxx.games.chastity.CardLockService; - public class TaskCard implements Card { @Override diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/TaskCardController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/TaskCardController.java new file mode 100644 index 0000000..8160f9d --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/TaskCardController.java @@ -0,0 +1,249 @@ +package de.oaa.xxx.games.chastity.cardlock; + +import de.oaa.xxx.games.chastity.tasks.AssignedTaskEntity; +import de.oaa.xxx.games.chastity.tasks.AssignedTaskRepository; +import de.oaa.xxx.games.chastity.tasks.Task; +import de.oaa.xxx.social.SseService; +import de.oaa.xxx.user.UserRepository; +import de.oaa.xxx.social.entity.MessageEntity; +import de.oaa.xxx.social.repository.MessageRepository; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.security.Principal; +import java.time.LocalDateTime; +import java.util.*; + +@RestController +@RequestMapping("/task-card") +public class TaskCardController { + + private final CardlockRepository cardlockRepository; + private final UserRepository userRepository; + private final KeyholderTaskChoiceRepository keyholderTaskChoiceRepository; + private final CommunityTaskVoteRepository communityTaskVoteRepository; + private final CommunityTaskVoteEntryRepository communityTaskVoteEntryRepository; + private final AssignedTaskRepository assignedTaskRepository; + private final MessageRepository messageRepository; + private final SseService sseService; + + public TaskCardController(CardlockRepository cardlockRepository, + UserRepository userRepository, + KeyholderTaskChoiceRepository keyholderTaskChoiceRepository, + CommunityTaskVoteRepository communityTaskVoteRepository, + CommunityTaskVoteEntryRepository communityTaskVoteEntryRepository, + AssignedTaskRepository assignedTaskRepository, + MessageRepository messageRepository, + SseService sseService) { + this.cardlockRepository = cardlockRepository; + this.userRepository = userRepository; + this.keyholderTaskChoiceRepository = keyholderTaskChoiceRepository; + this.communityTaskVoteRepository = communityTaskVoteRepository; + this.communityTaskVoteEntryRepository = communityTaskVoteEntryRepository; + this.assignedTaskRepository = assignedTaskRepository; + this.messageRepository = messageRepository; + this.sseService = sseService; + } + + // ── Keyholder: ausstehende Aufgaben-Karten-Entscheidungen ───────────────── + + @GetMapping("/keyholder/choices") + @Transactional(readOnly = true) + public ResponseEntity>> getPendingChoices(Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + + // Alle Locks bei denen ich Keyholder bin + var locks = cardlockRepository.findByKeyholderAndUnlockTimeIsNull(myId); + List> result = new ArrayList<>(); + + for (var lock : locks) { + var pending = keyholderTaskChoiceRepository.findByLockIdAndStatus(lock.getLockId(), "PENDING"); + if (pending.isEmpty()) continue; + + var lockee = userRepository.findById(lock.getLockee()).orElse(null); + List> taskList = buildTaskList(lock.getTasks()); + + for (var choice : pending) { + Map m = new LinkedHashMap<>(); + m.put("choiceId", choice.getChoiceId().toString()); + m.put("lockId", lock.getLockId().toString()); + m.put("lockName", lock.getName() != null ? lock.getName() : ""); + m.put("lockeeName", lockee != null ? lockee.getName() : ""); + m.put("createdAt", choice.getCreatedAt().toString()); + m.put("tasks", taskList); + result.add(m); + } + } + return ResponseEntity.ok(result); + } + + record PenaltyRequest(Integer penaltyFreezeMinutes, Integer penaltyRedCards) {} + + @PostMapping("/keyholder/choices/{choiceId}/choose/{taskIndex}") + @Transactional + public ResponseEntity chooseTask(@PathVariable UUID choiceId, + @PathVariable int taskIndex, + @org.springframework.web.bind.annotation.RequestBody(required = false) PenaltyRequest penalty, + Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + + var choiceOpt = keyholderTaskChoiceRepository.findById(choiceId); + if (choiceOpt.isEmpty()) return ResponseEntity.notFound().build(); + var choice = choiceOpt.get(); + + var lockOpt = cardlockRepository.findById(choice.getLockId()); + if (lockOpt.isEmpty()) return ResponseEntity.notFound().build(); + var lock = lockOpt.get(); + + if (!myId.equals(lock.getKeyholder())) return ResponseEntity.status(403).build(); + if (!"PENDING".equals(choice.getStatus())) return ResponseEntity.status(409).build(); + + List tasks = lock.getTasks(); + if (tasks == null || taskIndex < 0 || taskIndex >= tasks.size()) + return ResponseEntity.badRequest().build(); + + Task task = tasks.get(taskIndex); + AssignedTaskEntity assigned = new AssignedTaskEntity(); + assigned.setLockId(lock.getLockId()); + assigned.setTaskTitle(task.resolveTitle()); + assigned.setTaskDescription(task.getDescription()); + assigned.setTaskText(task.resolveTitle()); + assigned.setTaskMinutes(task.getMinutes()); + assigned.setAssignedAt(LocalDateTime.now()); + assigned.setAcceptDeadline(LocalDateTime.now().plusHours(1)); + assigned.setStatus("PENDING"); + if (penalty != null) { + assigned.setPenaltyFreezeMinutes(penalty.penaltyFreezeMinutes()); + assigned.setPenaltyRedCards(penalty.penaltyRedCards()); + } + assignedTaskRepository.save(assigned); + + choice.setStatus("CHOSEN"); + keyholderTaskChoiceRepository.save(choice); + + sendMessage(myId, lock.getLockee(), + "Dein Keyholder hat eine Aufgabe für dich ausgewählt.", + "/activelock.html?lockId=" + lock.getLockId()); + + return ResponseEntity.noContent().build(); + } + + // ── Community: aktive Abstimmungen ──────────────────────────────────────── + + @GetMapping("/community/votes") + @Transactional(readOnly = true) + public ResponseEntity>> getActiveVotes(Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + + var activeVotes = communityTaskVoteRepository.findByStatus("ACTIVE"); + List> result = new ArrayList<>(); + + for (var vote : activeVotes) { + if (vote.isTestLock()) continue; + var lockOpt = cardlockRepository.findById(vote.getLockId()); + if (lockOpt.isEmpty()) continue; + var lock = lockOpt.get(); + + var lockee = userRepository.findById(lock.getLockee()).orElse(null); + List tasks = lock.getTasks(); + if (tasks == null || tasks.isEmpty()) continue; + + List> taskList = buildTaskList(tasks); + + // Stimmenanzahl pro Task + List voteCounts = new ArrayList<>(); + for (int i = 0; i < tasks.size(); i++) { + voteCounts.add(communityTaskVoteEntryRepository + .countByVoteSessionIdAndTaskIndex(vote.getVoteSessionId(), i)); + } + + Integer myVote = communityTaskVoteEntryRepository.findByVoteSessionId(vote.getVoteSessionId()) + .stream().filter(e -> myId.equals(e.getVoterUserId())) + .map(CommunityTaskVoteEntryEntity::getTaskIndex).findFirst().orElse(null); + + Map m = new LinkedHashMap<>(); + m.put("voteSessionId", vote.getVoteSessionId().toString()); + m.put("lockId", lock.getLockId().toString()); + m.put("lockeeName", lockee != null ? lockee.getName() : ""); + m.put("expiresAt", vote.getExpiresAt().toString()); + m.put("tasks", taskList); + m.put("voteCounts", voteCounts); + m.put("myVote", myVote); + result.add(m); + } + return ResponseEntity.ok(result); + } + + @PostMapping("/community/votes/{voteSessionId}/vote/{taskIndex}") + @Transactional + public ResponseEntity castVote(@PathVariable UUID voteSessionId, + @PathVariable int taskIndex, + Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + + var voteOpt = communityTaskVoteRepository.findById(voteSessionId); + if (voteOpt.isEmpty()) return ResponseEntity.notFound().build(); + var vote = voteOpt.get(); + + if (!"ACTIVE".equals(vote.getStatus()) || vote.getExpiresAt().isBefore(LocalDateTime.now())) + return ResponseEntity.status(409).build(); + + var lockOpt = cardlockRepository.findById(vote.getLockId()); + if (lockOpt.isEmpty()) return ResponseEntity.notFound().build(); + var lock = lockOpt.get(); + + if (lock.getTasks() == null || taskIndex < 0 || taskIndex >= lock.getTasks().size()) + return ResponseEntity.badRequest().build(); + + if (communityTaskVoteEntryRepository.existsByVoteSessionIdAndVoterUserId(voteSessionId, myId)) + return ResponseEntity.status(409).build(); + + CommunityTaskVoteEntryEntity entry = new CommunityTaskVoteEntryEntity(); + entry.setVoteSessionId(voteSessionId); + entry.setVoterUserId(myId); + entry.setTaskIndex(taskIndex); + communityTaskVoteEntryRepository.save(entry); + + return ResponseEntity.noContent().build(); + } + + // ── Helpers ─────────────────────────────────────────────────────────────── + + private List> buildTaskList(List tasks) { + if (tasks == null) return List.of(); + List> list = new ArrayList<>(); + for (int i = 0; i < tasks.size(); i++) { + Task t = tasks.get(i); + Map m = new LinkedHashMap<>(); + m.put("index", i); + m.put("title", t.resolveTitle()); + m.put("description", t.getDescription() != null ? t.getDescription() : ""); + m.put("minutes", t.getMinutes() != null ? t.getMinutes() : 0); + list.add(m); + } + return list; + } + + private void sendMessage(UUID fromId, UUID toId, String text, String targetUrl) { + if (toId == null) return; + MessageEntity msg = new MessageEntity(); + msg.setMessageId(java.util.UUID.randomUUID()); + msg.setSenderId(fromId); + msg.setReceiverId(toId); + msg.setText(text); + msg.setSystemMessage(true); + msg.setTargetUrl(targetUrl); + msg.setSentAt(java.time.LocalDateTime.now()); + messageRepository.save(msg); + sseService.push(toId, "notification", Map.of("text", text)); + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/TaskVoteScheduler.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/TaskVoteScheduler.java new file mode 100644 index 0000000..d9faf5b --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/TaskVoteScheduler.java @@ -0,0 +1,132 @@ +package de.oaa.xxx.games.chastity.cardlock; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.UUID; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import de.oaa.xxx.games.chastity.tasks.AssignedTaskEntity; +import de.oaa.xxx.games.chastity.tasks.AssignedTaskRepository; +import de.oaa.xxx.games.chastity.tasks.Task; +import de.oaa.xxx.social.SseService; +import de.oaa.xxx.social.entity.MessageEntity; +import de.oaa.xxx.social.repository.MessageRepository; + +@Component +public class TaskVoteScheduler { + + private static final Logger LOG = LoggerFactory.getLogger(TaskVoteScheduler.class); + + private final CommunityTaskVoteRepository communityTaskVoteRepository; + private final CommunityTaskVoteEntryRepository communityTaskVoteEntryRepository; + private final CardlockRepository cardlockRepository; + private final AssignedTaskRepository assignedTaskRepository; + private final MessageRepository messageRepository; + private final SseService sseService; + + public TaskVoteScheduler(CommunityTaskVoteRepository communityTaskVoteRepository, + CommunityTaskVoteEntryRepository communityTaskVoteEntryRepository, + CardlockRepository cardlockRepository, + AssignedTaskRepository assignedTaskRepository, + MessageRepository messageRepository, + SseService sseService) { + this.communityTaskVoteRepository = communityTaskVoteRepository; + this.communityTaskVoteEntryRepository = communityTaskVoteEntryRepository; + this.cardlockRepository = cardlockRepository; + this.assignedTaskRepository = assignedTaskRepository; + this.messageRepository = messageRepository; + this.sseService = sseService; + } + + @Scheduled(fixedDelay = 60_000) + @Transactional + public void processExpiredVotes() { + var expired = communityTaskVoteRepository + .findByStatusAndExpiresAtBefore("ACTIVE", LocalDateTime.now()); + + for (var vote : expired) { + LOG.debug("Processing expired community task vote {}", vote.getVoteSessionId()); + + var lockOpt = cardlockRepository.findById(vote.getLockId()); + if (lockOpt.isEmpty()) { + vote.setStatus("COMPLETED"); + communityTaskVoteRepository.save(vote); + continue; + } + var lock = lockOpt.get(); + List tasks = lock.getTasks(); + if (tasks == null || tasks.isEmpty()) { + vote.setStatus("COMPLETED"); + communityTaskVoteRepository.save(vote); + continue; + } + + // Stimmen auszählen + var entries = communityTaskVoteEntryRepository.findByVoteSessionId(vote.getVoteSessionId()); + int winnerIndex; + if (entries.isEmpty()) { + winnerIndex = new Random().nextInt(tasks.size()); + LOG.debug("No votes → random task index {}", winnerIndex); + } else { + int[] counts = new int[tasks.size()]; + for (var e : entries) { + if (e.getTaskIndex() >= 0 && e.getTaskIndex() < tasks.size()) { + counts[e.getTaskIndex()]++; + } + } + int max = Arrays.stream(counts).max().getAsInt(); + // Alle Tasks mit Maximalstimmen sammeln → zufällige Auswahl bei Gleichstand + List winners = new ArrayList<>(); + for (int i = 0; i < counts.length; i++) { + if (counts[i] == max) winners.add(i); + } + winnerIndex = winners.get(new Random().nextInt(winners.size())); + LOG.debug("Vote winner: task index {} with {} votes", winnerIndex, max); + } + + Task task = tasks.get(winnerIndex); + AssignedTaskEntity assigned = new AssignedTaskEntity(); + assigned.setLockId(lock.getLockId()); + assigned.setTaskTitle(task.resolveTitle()); + assigned.setTaskDescription(task.getDescription()); + assigned.setTaskText(task.resolveTitle()); + assigned.setTaskMinutes(task.getMinutes()); + assigned.setAssignedAt(LocalDateTime.now()); + assigned.setAcceptDeadline(LocalDateTime.now().plusHours(1)); + assigned.setStatus("PENDING"); + assignedTaskRepository.save(assigned); + + vote.setStatus("COMPLETED"); + vote.setWinningTaskIndex(winnerIndex); + communityTaskVoteRepository.save(vote); + + // Lockee benachrichtigen + sendMessage(lock.getLockee(), + "Die Community hat für deine Aufgabe abgestimmt: \"" + task.resolveTitle() + "\"", + "/activelock.html?lockId=" + lock.getLockId()); + } + } + + private void sendMessage(UUID toId, String text, String targetUrl) { + if (toId == null) return; + MessageEntity msg = new MessageEntity(); + msg.setMessageId(UUID.randomUUID()); + msg.setSenderId(toId); // System-Nachricht, kein echter Sender + msg.setReceiverId(toId); + msg.setText(text); + msg.setSystemMessage(true); + msg.setTargetUrl(targetUrl); + msg.setSentAt(LocalDateTime.now()); + messageRepository.save(msg); + sseService.push(toId, "notification", Map.of("text", text)); + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/UnlockCodeHistoryEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/UnlockCodeHistoryEntity.java new file mode 100644 index 0000000..c4d2efc --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/UnlockCodeHistoryEntity.java @@ -0,0 +1,47 @@ +package de.oaa.xxx.games.chastity.cardlock; + +import jakarta.persistence.*; +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +@Table(name = "unlock_code_history") +public class UnlockCodeHistoryEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + @Column(nullable = false) + private UUID userId; + + @Column(nullable = false) + private UUID lockId; + + @Column + private String lockName; + + @Column(nullable = false) + private String unlockCode; + + /** GREEN_CARD | HYGIENE_OPEN | HYGIENE_CLOSE | KEYHOLDER_UNLOCK */ + @Column(nullable = false) + private String source; + + @Column(nullable = false) + private LocalDateTime receivedAt; + + public UUID getId() { return id; } + public UUID getUserId() { return userId; } + public void setUserId(UUID userId) { this.userId = userId; } + public UUID getLockId() { return lockId; } + public void setLockId(UUID lockId) { this.lockId = lockId; } + public String getLockName() { return lockName; } + public void setLockName(String lockName) { this.lockName = lockName; } + public String getUnlockCode() { return unlockCode; } + public void setUnlockCode(String unlockCode) { this.unlockCode = unlockCode; } + public String getSource() { return source; } + public void setSource(String source) { this.source = source; } + public LocalDateTime getReceivedAt() { return receivedAt; } + public void setReceivedAt(LocalDateTime receivedAt) { this.receivedAt = receivedAt; } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/UnlockCodeHistoryRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/UnlockCodeHistoryRepository.java new file mode 100644 index 0000000..e996faa --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/UnlockCodeHistoryRepository.java @@ -0,0 +1,23 @@ +package de.oaa.xxx.games.chastity.cardlock; + +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.UUID; + +public interface UnlockCodeHistoryRepository extends JpaRepository { + + List findByUserIdOrderByReceivedAtDesc(UUID userId, Pageable pageable); + + /** Prüft, ob für dieses Lock und diese Quelle bereits der gleiche Code gespeichert ist. */ + boolean existsByLockIdAndSourceAndUnlockCode(UUID lockId, String source, String unlockCode); + + /** Alle Einträge des Users aufsteigend (für Cleanup: älteste löschen). */ + @Query("SELECT e FROM UnlockCodeHistoryEntity e WHERE e.userId = :userId ORDER BY e.receivedAt ASC") + List findByUserIdOrderByReceivedAtAsc(@Param("userId") UUID userId); + + long countByUserId(UUID userId); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/YellowCard.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/YellowCard.java index 7c3efba..2de9b81 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/YellowCard.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/cardlock/YellowCard.java @@ -1,7 +1,5 @@ package de.oaa.xxx.games.chastity.cardlock; -import de.oaa.xxx.games.chastity.CardLockService; - public class YellowCard implements Card { @Override diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/tasks/AssignedTaskEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/tasks/AssignedTaskEntity.java new file mode 100644 index 0000000..46976f7 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/tasks/AssignedTaskEntity.java @@ -0,0 +1,80 @@ +package de.oaa.xxx.games.chastity.tasks; + +import jakarta.persistence.*; +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +@Table(name = "assigned_task") +public class AssignedTaskEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID taskId; + + @Column(nullable = false) + private UUID lockId; + + @Column + private String taskTitle; + + @Column(columnDefinition = "TEXT") + private String taskDescription; + + @Column(columnDefinition = "TEXT", nullable = false) + private String taskText; + + @Column + private Integer taskMinutes; + + @Column(nullable = false) + private LocalDateTime assignedAt; + + @Column(nullable = false) + private LocalDateTime acceptDeadline; + + /** Wie viele Minuten einfrieren bei Ablehnung / Ablauf (null = keine Freeze-Strafe). */ + @Column + private Integer penaltyFreezeMinutes; + + /** Wie viele rote Karten hinzufügen bei Ablehnung / Ablauf (null = keine). */ + @Column + private Integer penaltyRedCards; + + /** PENDING | ACCEPTED | DECLINED | EXPIRED */ + @Column(nullable = false) + private String status = "PENDING"; + + public UUID getTaskId() { return taskId; } + public void setTaskId(UUID taskId) { this.taskId = taskId; } + + public UUID getLockId() { return lockId; } + public void setLockId(UUID lockId) { this.lockId = lockId; } + + public String getTaskTitle() { return taskTitle; } + public void setTaskTitle(String taskTitle) { this.taskTitle = taskTitle; } + + public String getTaskDescription() { return taskDescription; } + public void setTaskDescription(String d) { this.taskDescription = d; } + + public String getTaskText() { return taskText; } + public void setTaskText(String taskText) { this.taskText = taskText; } + + public Integer getTaskMinutes() { return taskMinutes; } + public void setTaskMinutes(Integer m) { this.taskMinutes = m; } + + public LocalDateTime getAssignedAt() { return assignedAt; } + public void setAssignedAt(LocalDateTime t) { this.assignedAt = t; } + + public LocalDateTime getAcceptDeadline() { return acceptDeadline; } + public void setAcceptDeadline(LocalDateTime t) { this.acceptDeadline = t; } + + public Integer getPenaltyFreezeMinutes() { return penaltyFreezeMinutes; } + public void setPenaltyFreezeMinutes(Integer m) { this.penaltyFreezeMinutes = m; } + + public Integer getPenaltyRedCards() { return penaltyRedCards; } + public void setPenaltyRedCards(Integer n) { this.penaltyRedCards = n; } + + public String getStatus() { return status; } + public void setStatus(String status) { this.status = status; } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/tasks/AssignedTaskRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/tasks/AssignedTaskRepository.java new file mode 100644 index 0000000..2f29978 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/tasks/AssignedTaskRepository.java @@ -0,0 +1,10 @@ +package de.oaa.xxx.games.chastity.tasks; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.UUID; + +public interface AssignedTaskRepository extends JpaRepository { + List findByLockIdAndStatus(UUID lockId, String status); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/tasks/Task.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/tasks/Task.java index 932d2dc..ee90602 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/tasks/Task.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/tasks/Task.java @@ -2,29 +2,34 @@ package de.oaa.xxx.games.chastity.tasks; public class Task { - private String text; + private String title; + private String description; private Integer minutes; - public String getText() { - return text; - } + /** @deprecated Backward-Compat – alte Einträge ohne title/description. Nur lesen, nicht setzen. */ + private String text; - public void setText(String text) { - this.text = text; - } + public String getTitle() { return title; } + public void setTitle(String title) { this.title = title; } - public Integer getMinutes() { - return minutes; - } + public String getDescription() { return description; } + public void setDescription(String description) { this.description = description; } - public void setMinutes(Integer minutes) { - this.minutes = minutes; + public Integer getMinutes() { return minutes; } + public void setMinutes(Integer minutes) { this.minutes = minutes; } + + public String getText() { return text; } + public void setText(String text) { this.text = text; } + + /** Gibt den anzeigbaren Titel zurück – fällt auf altes text-Feld zurück. */ + public String resolveTitle() { + if (title != null && !title.isBlank()) return title; + if (text != null && !text.isBlank()) return text; + return "Aufgabe"; } @Override public String toString() { - return "Task [text=" + text + ", minutes=" + minutes + "]"; + return "Task[title=" + title + ", minutes=" + minutes + "]"; } - - } diff --git a/xxxthegame/src/main/java/de/oaa/xxx/social/EventController.java b/xxxthegame/src/main/java/de/oaa/xxx/social/EventController.java new file mode 100644 index 0000000..c811555 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/social/EventController.java @@ -0,0 +1,30 @@ +package de.oaa.xxx.social; + +import de.oaa.xxx.user.UserRepository; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.security.Principal; + +@RestController +@RequestMapping("/events") +public class EventController { + + private final SseService sseService; + private final UserRepository userRepository; + + public EventController(SseService sseService, UserRepository userRepository) { + this.sseService = sseService; + this.userRepository = userRepository; + } + + @GetMapping(path = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public SseEmitter stream(Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) throw new RuntimeException("Not authenticated"); + return sseService.subscribe(meOpt.get().getUserId()); + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/social/NotificationController.java b/xxxthegame/src/main/java/de/oaa/xxx/social/NotificationController.java new file mode 100644 index 0000000..0a3f029 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/social/NotificationController.java @@ -0,0 +1,81 @@ +package de.oaa.xxx.social; + +import de.oaa.xxx.social.repository.MessageRepository; +import de.oaa.xxx.user.UserRepository; +import org.springframework.data.domain.PageRequest; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.security.Principal; +import java.time.LocalDateTime; +import java.util.*; + +@RestController +@RequestMapping("/notifications") +public class NotificationController { + + private final MessageRepository messageRepository; + private final UserRepository userRepository; + + public NotificationController(MessageRepository messageRepository, + UserRepository userRepository) { + this.messageRepository = messageRepository; + this.userRepository = userRepository; + } + + @GetMapping + public ResponseEntity>> getNotifications(Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + + List> result = messageRepository + .findNotificationsForUser(myId, PageRequest.of(0, 10)) + .stream() + .map(m -> { + Map n = new LinkedHashMap<>(); + n.put("id", m.getMessageId().toString()); + n.put("text", m.getText()); + n.put("sentAt", m.getSentAt().toString()); + n.put("read", m.getReadAt() != null); + n.put("targetUrl", m.getTargetUrl() != null ? m.getTargetUrl() : ""); + userRepository.findById(m.getSenderId()).ifPresent(sender -> { + n.put("senderName", sender.getName()); + n.put("senderAvatar", sender.getProfilePicture() != null ? sender.getProfilePicture() : ""); + }); + return n; + }) + .toList(); + return ResponseEntity.ok(result); + } + + @GetMapping("/unread/count") + public ResponseEntity getUnreadCount(Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + return ResponseEntity.ok( + messageRepository.countByReceiverIdAndSystemMessageAndReadAtIsNull(myId, true)); + } + + @Transactional + @PostMapping("/{id}/read") + public ResponseEntity markOneRead(@PathVariable UUID id, Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + messageRepository.markNotificationAsRead(id, myId, LocalDateTime.now()); + return ResponseEntity.noContent().build(); + } + + @Transactional + @PostMapping("/read-all") + public ResponseEntity markAllRead(Principal principal) { + var meOpt = userRepository.findByEmail(principal.getName()); + if (meOpt.isEmpty()) return ResponseEntity.status(401).build(); + UUID myId = meOpt.get().getUserId(); + messageRepository.markAllNotificationsAsRead(myId, LocalDateTime.now()); + return ResponseEntity.noContent().build(); + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/social/SocialController.java b/xxxthegame/src/main/java/de/oaa/xxx/social/SocialController.java index da391d4..d939dbe 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/social/SocialController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/social/SocialController.java @@ -30,13 +30,16 @@ public class SocialController { private final UserRepository userRepository; private final FriendshipRepository friendshipRepository; private final MessageRepository messageRepository; + private final SseService sseService; public SocialController(UserRepository userRepository, FriendshipRepository friendshipRepository, - MessageRepository messageRepository) { + MessageRepository messageRepository, + SseService sseService) { this.userRepository = userRepository; this.friendshipRepository = friendshipRepository; this.messageRepository = messageRepository; + this.sseService = sseService; } record FriendRequestBody(UUID receiverId) {} @@ -210,6 +213,8 @@ public class SocialController { msg.setSentAt(LocalDateTime.now()); messageRepository.save(msg); LOGGER.debug("User {} hat Nachricht an User {} gesendet", myId, body.receiverId()); + long unread = messageRepository.countUnread(body.receiverId()); + sseService.push(body.receiverId(), "DM", Map.of("unreadCount", unread, "senderId", myId.toString())); return ResponseEntity.status(201).build(); } diff --git a/xxxthegame/src/main/java/de/oaa/xxx/social/SseService.java b/xxxthegame/src/main/java/de/oaa/xxx/social/SseService.java new file mode 100644 index 0000000..e58ba13 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/social/SseService.java @@ -0,0 +1,54 @@ +package de.oaa.xxx.social; + +import jakarta.annotation.PreDestroy; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +@Service +public class SseService { + + private final Map> emitters = new ConcurrentHashMap<>(); + + @PreDestroy + public void shutdown() { + emitters.values().forEach(list -> list.forEach(SseEmitter::complete)); + emitters.clear(); + } + + public SseEmitter subscribe(UUID userId) { + SseEmitter emitter = new SseEmitter(30_000L); // 30 s – Client reconnects automatically + emitters.computeIfAbsent(userId, k -> new CopyOnWriteArrayList<>()).add(emitter); + Runnable cleanup = () -> removeEmitter(userId, emitter); + emitter.onCompletion(cleanup); + emitter.onTimeout(() -> { emitter.complete(); cleanup.run(); }); + emitter.onError(e -> cleanup.run()); + return emitter; + } + + /** Pushes a named SSE event to all open connections of the given user. */ + public void push(UUID userId, String eventName, Object data) { + List list = emitters.get(userId); + if (list == null || list.isEmpty()) return; + list.removeIf(emitter -> { + try { + emitter.send(SseEmitter.event().name(eventName).data(data, MediaType.APPLICATION_JSON)); + return false; + } catch (IOException e) { + return true; + } + }); + } + + private void removeEmitter(UUID userId, SseEmitter emitter) { + List list = emitters.get(userId); + if (list != null) list.remove(emitter); + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/social/entity/MessageEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/social/entity/MessageEntity.java index 7aac334..080630e 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/social/entity/MessageEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/social/entity/MessageEntity.java @@ -27,6 +27,12 @@ public class MessageEntity { @Column private LocalDateTime readAt; + @Column(nullable = false) + private boolean systemMessage = false; + + @Column(length = 500) + private String targetUrl; + public UUID getMessageId() { return messageId; } public void setMessageId(UUID messageId) { this.messageId = messageId; } @@ -44,4 +50,10 @@ public class MessageEntity { public LocalDateTime getReadAt() { return readAt; } public void setReadAt(LocalDateTime readAt) { this.readAt = readAt; } + + public boolean isSystemMessage() { return systemMessage; } + public void setSystemMessage(boolean systemMessage) { this.systemMessage = systemMessage; } + + public String getTargetUrl() { return targetUrl; } + public void setTargetUrl(String targetUrl) { this.targetUrl = targetUrl; } } diff --git a/xxxthegame/src/main/java/de/oaa/xxx/social/repository/MessageRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/social/repository/MessageRepository.java index 5500d64..ce749be 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/social/repository/MessageRepository.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/social/repository/MessageRepository.java @@ -14,23 +14,44 @@ import java.util.UUID; public interface MessageRepository extends JpaRepository { - @Query("SELECT m FROM MessageEntity m WHERE (m.senderId = :userA AND m.receiverId = :userB) OR (m.senderId = :userB AND m.receiverId = :userA) ORDER BY m.sentAt DESC") + // ── DM queries (systemMessage = false) ──────────────────────────────────── + + @Query("SELECT m FROM MessageEntity m WHERE ((m.senderId = :userA AND m.receiverId = :userB) OR (m.senderId = :userB AND m.receiverId = :userA)) AND m.systemMessage = false ORDER BY m.sentAt DESC") List findConversation(@Param("userA") UUID userA, @Param("userB") UUID userB, Pageable pageable); - @Query("SELECT m FROM MessageEntity m WHERE ((m.senderId = :userA AND m.receiverId = :userB) OR (m.senderId = :userB AND m.receiverId = :userA)) AND m.sentAt < :before ORDER BY m.sentAt DESC") + @Query("SELECT m FROM MessageEntity m WHERE ((m.senderId = :userA AND m.receiverId = :userB) OR (m.senderId = :userB AND m.receiverId = :userA)) AND m.systemMessage = false AND m.sentAt < :before ORDER BY m.sentAt DESC") List findConversationBefore(@Param("userA") UUID userA, @Param("userB") UUID userB, @Param("before") LocalDateTime before, Pageable pageable); - @Query("SELECT m FROM MessageEntity m WHERE ((m.senderId = :userA AND m.receiverId = :userB) OR (m.senderId = :userB AND m.receiverId = :userA)) AND m.sentAt > :after ORDER BY m.sentAt ASC") + @Query("SELECT m FROM MessageEntity m WHERE ((m.senderId = :userA AND m.receiverId = :userB) OR (m.senderId = :userB AND m.receiverId = :userA)) AND m.systemMessage = false AND m.sentAt > :after ORDER BY m.sentAt ASC") List findConversationAfter(@Param("userA") UUID userA, @Param("userB") UUID userB, @Param("after") LocalDateTime after); - @Query("SELECT m FROM MessageEntity m WHERE m.senderId = :userId OR m.receiverId = :userId ORDER BY m.sentAt DESC") + @Query("SELECT m FROM MessageEntity m WHERE (m.senderId = :userId OR m.receiverId = :userId) AND m.systemMessage = false ORDER BY m.sentAt DESC") List findAllByUser(@Param("userId") UUID userId); - @Query("SELECT COUNT(m) FROM MessageEntity m WHERE m.receiverId = :userId AND m.readAt IS NULL") + @Query("SELECT COUNT(m) FROM MessageEntity m WHERE m.receiverId = :userId AND m.readAt IS NULL AND m.systemMessage = false") long countUnread(@Param("userId") UUID userId); @Modifying @Transactional - @Query("UPDATE MessageEntity m SET m.readAt = :now WHERE m.senderId = :partnerId AND m.receiverId = :userId AND m.readAt IS NULL") + @Query("UPDATE MessageEntity m SET m.readAt = :now WHERE m.senderId = :partnerId AND m.receiverId = :userId AND m.readAt IS NULL AND m.systemMessage = false") void markAsRead(@Param("userId") UUID userId, @Param("partnerId") UUID partnerId, @Param("now") LocalDateTime now); + + // ── Notification queries (systemMessage = true) ─────────────────────────── + + /** Ungelesene zuerst, dann nach sentAt absteigend, max. 10 Einträge. */ + @Query("SELECT m FROM MessageEntity m WHERE m.receiverId = :receiverId AND m.systemMessage = true " + + "ORDER BY CASE WHEN m.readAt IS NULL THEN 0 ELSE 1 END, m.sentAt DESC") + List findNotificationsForUser(@Param("receiverId") UUID receiverId, Pageable pageable); + + long countByReceiverIdAndSystemMessageAndReadAtIsNull(UUID receiverId, boolean systemMessage); + + @Modifying + @Transactional + @Query("UPDATE MessageEntity m SET m.readAt = :now WHERE m.receiverId = :userId AND m.systemMessage = true AND m.readAt IS NULL") + void markAllNotificationsAsRead(@Param("userId") UUID userId, @Param("now") LocalDateTime now); + + @Modifying + @Transactional + @Query("UPDATE MessageEntity m SET m.readAt = :now WHERE m.messageId = :id AND m.receiverId = :userId AND m.readAt IS NULL") + void markNotificationAsRead(@Param("id") UUID id, @Param("userId") UUID userId, @Param("now") LocalDateTime now); } diff --git a/xxxthegame/src/main/resources/application.properties b/xxxthegame/src/main/resources/application.properties index 17524b9..760d369 100644 --- a/xxxthegame/src/main/resources/application.properties +++ b/xxxthegame/src/main/resources/application.properties @@ -7,6 +7,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # JPA / Hibernate spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=false +spring.jpa.open-in-view=false spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.properties.hibernate.type.preferred_uuid_jdbc_type=VARCHAR @@ -45,10 +46,15 @@ app.theme.color-success=#2ecc71 # Logging logging.level.de.oaa.xxx=DEBUG +# Spring 6.2.3 Bug: NPE in DisconnectedClientHelper bei AsyncRequestTimeoutException (SSE-Reconnect) – harmlos +logging.level.org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver=ERROR +logging.level.org.apache.catalina.core.AsyncContextImpl=ERROR # Server server.port=8080 server.servlet.context-path=/ +server.shutdown=graceful +spring.lifecycle.timeout-per-shutdown-phase=5s # Multipart upload spring.servlet.multipart.max-file-size=20MB diff --git a/xxxthegame/src/main/resources/static/sessionchastityingame.html b/xxxthegame/src/main/resources/static/activelock.html similarity index 71% rename from xxxthegame/src/main/resources/static/sessionchastityingame.html rename to xxxthegame/src/main/resources/static/activelock.html index 933e57d..e9a6cc4 100644 --- a/xxxthegame/src/main/resources/static/sessionchastityingame.html +++ b/xxxthegame/src/main/resources/static/activelock.html @@ -113,37 +113,25 @@ color: #fff; } - /* ── Frozen-Overlay (Eis) ── */ - .nextcard-overlay.frozen { + /* ── Frost-Overlay (Eis) – gemeinsam für frozen + task ── */ + .nextcard-overlay.frozen, + .nextcard-overlay.task { border-radius: 6px; background: radial-gradient(ellipse at 18% 28%, rgba(255,255,255,0.38) 0%, transparent 48%), radial-gradient(ellipse at 82% 72%, rgba(255,255,255,0.28) 0%, transparent 42%), radial-gradient(ellipse at 55% 12%, rgba(255,255,255,0.22) 0%, transparent 38%), rgba(55,140,210,0.68); - background-image: - radial-gradient(ellipse at 18% 28%, rgba(255,255,255,0.38) 0%, transparent 48%), - radial-gradient(ellipse at 82% 72%, rgba(255,255,255,0.28) 0%, transparent 42%), - radial-gradient(ellipse at 55% 12%, rgba(255,255,255,0.22) 0%, transparent 38%), - url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48'%3E%3Cg stroke='rgba(255,255,255,0.25)' stroke-width='1' fill='none'%3E%3Cline x1='24' y1='4' x2='24' y2='44'/%3E%3Cline x1='4' y1='14' x2='44' y2='34'/%3E%3Cline x1='4' y1='34' x2='44' y2='14'/%3E%3Cline x1='24' y1='4' x2='19' y2='12'/%3E%3Cline x1='24' y1='4' x2='29' y2='12'/%3E%3Cline x1='24' y1='44' x2='19' y2='36'/%3E%3Cline x1='24' y1='44' x2='29' y2='36'/%3E%3Cline x1='4' y1='14' x2='11' y2='17'/%3E%3Cline x1='4' y1='14' x2='9' y2='22'/%3E%3Cline x1='44' y1='34' x2='37' y2='31'/%3E%3Cline x1='44' y1='34' x2='39' y2='26'/%3E%3Cline x1='4' y1='34' x2='11' y2='31'/%3E%3Cline x1='4' y1='34' x2='9' y2='26'/%3E%3Cline x1='44' y1='14' x2='37' y2='17'/%3E%3Cline x1='44' y1='14' x2='39' y2='22'/%3E%3C/g%3E%3C/svg%3E"); background-size: auto, auto, auto, 48px 48px; } - .frozen-label { - font-size: 1.2rem; - font-weight: 700; - color: #fff; - text-shadow: 0 1px 6px rgba(0,80,180,0.6); - letter-spacing: 0.05em; - } - /* ── Task-Overlay ── */ .nextcard-task-box { display: flex; flex-direction: column; align-items: center; gap: 0.6rem; - background: rgba(0,0,0,0.5); - border: 1px solid rgba(255,255,255,0.3); + background: var(--color-card); + border: 1px solid var(--color-secondary); border-radius: 10px; padding: 0.9rem 1.2rem; max-width: 85%; @@ -151,14 +139,14 @@ } .nextcard-task-text { font-size: 0.92rem; - color: #fff; + color: var(--color-text); line-height: 1.5; } .nextcard-task-countdown { font-size: 1.1rem; font-weight: 700; font-family: monospace; - color: rgba(255,220,100,0.95); + color: var(--color-primary); } .btn-task-erledigt { padding: 0.45rem 1.2rem; @@ -557,6 +545,9 @@
Keyholder*In:
+ + + @@ -706,9 +696,13 @@

+ +
-

+

Du hast die grüne Karte gezogen!
Möchtest du den Entsperrcode erhalten und die Session beenden,
oder die Karte zurücklegen?

@@ -724,22 +718,48 @@
- +
-

Lock wirklich beenden?

-

- Wenn du das Lock beendest, wird der Entsperrcode unwiderruflich gelöscht. - Der Code kann danach nicht wiederhergestellt werden. -

+

Lock beenden?

+

Dein Entsperrcode:

+
- + +
+
+
+ + +
+
+

🆘 Notfall-Entsperrung

+
+
+ + +
+
+
+ + + + @@ -761,14 +781,114 @@ return; } const lock = await res.json(); + _currentLock = lock; document.getElementById('lockContent').textContent = ''; document.getElementById('keyholderPendingBanner').style.display = lock.keyholderInvitationPending ? '' : 'none'; renderKeyholderBar(lock); + renderAssignedTasks(lock); renderNextCardPanel(lock); renderHygienePanel(lock); renderVerificationPanel(lock); renderCardsPanel(lock); + + if (lock.keyholderRequestedUnlock) { + showKeyholderUnlockModal(lock.unlockCode || ''); + } + renderLockActionArea(lock); + } + + function showKeyholderUnlockModal(unlockCode) { + const modal = document.getElementById('drawModal'); + const inner = document.getElementById('flipCardInner'); + const info = document.getElementById('drawCardInfo'); + const green = document.getElementById('drawGreenChoice'); + const actions = document.getElementById('drawModalActions'); + const hint = document.getElementById('drawTaskPendingHint'); + + // Direkt aufgedeckt mit grüner Karte zeigen + inner.classList.remove('flipped'); + info.classList.remove('visible'); + green.classList.remove('visible'); + hint.style.display = 'none'; + document.getElementById('drawUnlockCode').style.display = 'none'; + document.getElementById('btnDrawOk').style.display = 'none'; + document.getElementById('btnDrawUnlock').style.display = 'none'; + document.getElementById('btnDrawKeep').style.display = 'none'; + actions.style.display = 'none'; + drawnUnlockCode = unlockCode; + modal.classList.add('open'); + + const def = CARD_LABELS['GREEN']; + setTimeout(() => { + document.getElementById('drawnCardImg').src = def.img; + document.getElementById('drawnCardImg').alt = def.name; + inner.classList.add('flipped'); + setTimeout(() => { + const khName = _currentLock && _currentLock.keyholderName ? _currentLock.keyholderName : 'Deine Keyholderin'; + document.getElementById('drawCardName').textContent = def.name; + document.getElementById('drawCardDesc').textContent = `🔑 ${khName} hat das Lock freigegeben.`; + document.getElementById('drawGreenText').style.display = 'none'; + info.classList.add('visible'); + actions.style.display = ''; + green.classList.add('visible'); + document.getElementById('btnDrawUnlock').style.display = ''; + document.getElementById('btnDrawKeep').style.display = 'none'; + }, 700); + }, 800); + } + + let _currentLock = null; + + function renderLockActionArea(lock) { + const area = document.getElementById('lockActionArea'); + if (!area) return; + if (lock.testLock) { + area.innerHTML = ``; + } else if (lock.emergencyUnlockRequested) { + const khName = lock.keyholderName || 'Deine Keyholderin'; + area.innerHTML = `
+ ⏳ Notfall-Entsperrung angefordert – ${khName} wurde benachrichtigt. +
`; + } else { + area.innerHTML = ``; + } + } + + function openEmergencyModal() { + const khName = _currentLock && _currentLock.keyholderName ? _currentLock.keyholderName : 'Deine Keyholderin'; + document.getElementById('emergencyModalContent').innerHTML = ` +

+ Im Notfall kannst du eine sofortige Freigabe anfordern.
+ ${khName} wird benachrichtigt und hat 1 Stunde Zeit zu reagieren. + Reagiert ${khName} nicht, öffnet sich das Lock automatisch. +

`; + document.getElementById('emergencyModalActions').style.display = ''; + document.getElementById('emergencyModal').classList.add('open'); + } + + function closeEmergencyModal() { + document.getElementById('emergencyModal').classList.remove('open'); + } + + async function confirmEmergency() { + document.getElementById('emergencyModalActions').style.display = 'none'; + try { + const res = await fetch('/keyholder/cardlock/' + lockId + '/emergency-unlock', { method: 'POST' }); + if (res.ok || res.status === 204) { + const khName2 = _currentLock && _currentLock.keyholderName ? _currentLock.keyholderName : 'Deine Keyholderin'; + document.getElementById('emergencyModalContent').innerHTML = ` +

+ ✅ Notfall-Anfrage wurde gesendet. ${khName2} wurde benachrichtigt. +

`; + setTimeout(() => { closeEmergencyModal(); loadLock(); }, 2000); + } + } catch(e) { + document.getElementById('emergencyModalContent').innerHTML = `

Fehler beim Senden der Anfrage.

`; + } } let tickInterval = null; @@ -784,6 +904,118 @@ : `${m}:${String(s).padStart(2,'0')}`; } + // ── Keyholder-Aufgaben ────────────────────────────────────────────────────── + + let activeAssignedTaskId = null; + + function fmtDateTime(iso) { + const dt = new Date(iso); + return dt.toLocaleDateString('de-DE') + ', ' + dt.toLocaleTimeString('de-DE', { hour:'2-digit', minute:'2-digit' }) + ' Uhr'; + } + + const assignedTaskCache = {}; + + function renderAssignedTasks(lock) { + const area = document.getElementById('assignedTasksArea'); + const tasks = lock.assignedTasks || []; + // Aufgaben ausblenden wenn bereits eine Aufgabe aktiv ist (nicht bei Keyholder-Freeze) + if (tasks.length === 0 || (lock.currentTask && lock.currentTask.trim())) { + area.style.display = 'none'; area.innerHTML = ''; return; + } + area.style.display = ''; + area.innerHTML = tasks.map(t => { + assignedTaskCache[t.taskId] = t; + const deadline = new Date(t.acceptDeadline); + const remaining = deadline - Date.now(); + const urgent = remaining < 60 * 60 * 1000; // < 1h + const titleEsc = (t.taskTitle || '').replace(//g,'>'); + const descEsc = (t.taskDescription || '').replace(//g,'>'); + const mins = t.taskMinutes > 0 ? ` · ${t.taskMinutes} Min.` : ''; + return `
+ +
+
${titleEsc}${mins}
+ ${descEsc ? `
${descEsc}
` : ''} +
Gestellt: ${fmtDateTime(t.assignedAt)}
+
Fällig bis: ${fmtDateTime(t.acceptDeadline)}
+
+ Details → +
`; + }).join(''); + } + + function openAssignedTaskModal(taskId) { + const t = assignedTaskCache[taskId]; + if (!t) return; + activeAssignedTaskId = taskId; + document.getElementById('assignedTaskModalError').style.display = 'none'; + const titleEsc = (t.taskTitle || '').replace(//g,'>'); + const descEsc = (t.taskDescription || '').replace(//g,'>'); + const taskMinutes = t.taskMinutes || 0; + const penaltyFreezeMinutes = t.penaltyFreezeMinutes; + const penaltyRedCards = t.penaltyRedCards; + const minsHtml = taskMinutes > 0 ? `
Zeit: ${taskMinutes} Minute${taskMinutes !== 1 ? 'n' : ''}
` : ''; + const descHtml = descEsc ? `
${descEsc}
` : ''; + document.getElementById('assignedTaskModalInfo').innerHTML = + `
${titleEsc}
` + + descHtml + minsHtml + + `
Gestellt am: ${fmtDateTime(t.assignedAt)}
` + + `
Annehmen bis: ${fmtDateTime(t.acceptDeadline)}
`; + const penaltyParts = []; + if (penaltyFreezeMinutes > 0) { + const d = Math.floor(penaltyFreezeMinutes / 1440); + const h = Math.floor((penaltyFreezeMinutes % 1440) / 60); + const m = penaltyFreezeMinutes % 60; + const parts = []; + if (d) parts.push(d + 'd'); + if (h) parts.push(h + 'h'); + if (m) parts.push(m + 'min'); + penaltyParts.push('❄️ Einfrieren für ' + parts.join(' ')); + } + if (penaltyRedCards > 0) penaltyParts.push('🔴 ' + penaltyRedCards + ' rote Karte' + (penaltyRedCards !== 1 ? 'n' : '') + ' hinzufügen'); + document.getElementById('assignedTaskPenaltyInfo').innerHTML = + 'Strafe bei Ablehnung:
' + (penaltyParts.join('
') || '–'); + document.getElementById('assignedTaskModal').style.display = 'flex'; + } + + function closeAssignedTaskModal() { + document.getElementById('assignedTaskModal').style.display = 'none'; + activeAssignedTaskId = null; + } + + async function respondAssignedTask(action) { + if (!activeAssignedTaskId) return; + const errEl = document.getElementById('assignedTaskModalError'); + errEl.style.display = 'none'; + try { + const res = await fetch(`/keyholder/cardlock/${lockId}/assigned-tasks/${activeAssignedTaskId}/${action}`, { method: 'POST' }); + if (res.ok || res.status === 204) { + closeAssignedTaskModal(); + loadLock(); + } else { + const data = await res.json().catch(() => ({})); + errEl.textContent = data.error || 'Fehler.'; + errEl.style.display = ''; + } + } catch(e) { + errEl.textContent = 'Fehler bei der Verbindung.'; + errEl.style.display = ''; + } + } + + document.getElementById('assignedTaskModal').addEventListener('click', e => { + if (e.target === e.currentTarget) closeAssignedTaskModal(); + }); + document.addEventListener('keydown', e => { + if (e.key === 'Escape' && document.getElementById('assignedTaskModal').style.display === 'flex') + closeAssignedTaskModal(); + }); + + // ── Keyholder-Bar ────────────────────────────────────────────────────────── + function renderKeyholderBar(lock) { const bar = document.getElementById('keyholderInfoBar'); const avatar = document.getElementById('keyholderInfoAvatar'); @@ -827,53 +1059,57 @@ const frozenLabel = document.getElementById('nextcardFrozenLabel'); const overlayLabel = document.getElementById('nextcardOverlayLabel'); const taskText = document.getElementById('nextcardTaskText'); + const taskDesc = document.getElementById('nextcardTaskDescription'); const taskCountdown = document.getElementById('nextcardTaskCountdown'); const btnErledigt = document.getElementById('btnTaskErledigt'); // Overlay-Reset - overlay.classList.remove('frozen'); + overlay.classList.remove('frozen', 'task'); timerBox.style.display = 'none'; taskBox.style.display = 'none'; countdown.style.display = 'none'; frozenLabel.style.display = 'none'; - const frozenUntill = lock.frozenUntill ? new Date(lock.frozenUntill) : null; - const currentTask = lock.currentTask || null; + const frozenUntill = lock.frozenUntill ? new Date(lock.frozenUntill) : null; + const taskFrozenUntil = lock.taskFrozenUntil ? new Date(lock.taskFrozenUntil) : null; + const currentTask = lock.currentTask || null; + const currentTaskDesc = lock.currentTaskDescription || null; - // ── Zustand 1: Task + Freeze-Countdown ────────────────────────────── - if (frozenUntill && currentTask) { - overlay.style.display = ''; - taskBox.style.display = ''; - taskText.textContent = currentTask; - taskCountdown.style.display = ''; - btnErledigt.disabled = true; - - function tickTask() { - const diff = frozenUntill - Date.now(); - if (diff <= 0) { - taskCountdown.style.display = 'none'; - btnErledigt.disabled = false; - clearInterval(tickInterval); tickInterval = null; - return; - } - taskCountdown.textContent = fmtCountdown(diff); - } - tickTask(); - tickInterval = setInterval(tickTask, 1000); - return; - } - - // ── Zustand 2: Nur Task (sofort erledigbar) ────────────────────────── + // ── Zustand 1: Aktive Aufgabe (mit oder ohne Task-Timer) ───────────── if (currentTask) { overlay.style.display = ''; + overlay.classList.add('task'); taskBox.style.display = ''; taskText.textContent = currentTask; - taskCountdown.style.display = 'none'; - btnErledigt.disabled = false; + if (currentTaskDesc) { + taskDesc.textContent = currentTaskDesc; + taskDesc.style.display = ''; + } else { + taskDesc.style.display = 'none'; + } + if (taskFrozenUntil && taskFrozenUntil > new Date()) { + btnErledigt.disabled = true; + taskCountdown.style.display = ''; + function tickTask() { + const diff = taskFrozenUntil - Date.now(); + if (diff <= 0) { + taskCountdown.style.display = 'none'; + btnErledigt.disabled = false; + clearInterval(tickInterval); tickInterval = null; + return; + } + taskCountdown.textContent = '⏱ noch ' + fmtCountdown(diff); + } + tickTask(); + tickInterval = setInterval(tickTask, 1000); + } else { + btnErledigt.disabled = false; + taskCountdown.style.display = 'none'; + } return; } - // ── Zustand 3: Nur eingefroren ─────────────────────────────────────── + // ── Zustand 2: Nur Keyholder-Freeze (keine Aufgabe) ────────────────── if (frozenUntill && frozenUntill > new Date()) { overlay.style.display = ''; overlay.classList.add('frozen'); @@ -1045,7 +1281,9 @@ inner.classList.remove('flipped'); info.classList.remove('visible'); green.classList.remove('visible'); - document.getElementById('drawUnlockCode').style.display = 'none'; + document.getElementById('drawGreenText').style.display = ''; + document.getElementById('drawUnlockCode').style.display = 'none'; + document.getElementById('drawTaskPendingHint').style.display = 'none'; document.getElementById('btnDrawOk').style.display = ''; document.getElementById('btnDrawUnlock').style.display = 'none'; document.getElementById('btnDrawKeep').style.display = 'none'; @@ -1073,6 +1311,16 @@ info.classList.add('visible'); actions.style.display = ''; + if (dto.taskPending) { + const msgs = { + 'KEYHOLDER': '🔑 Dein Keyholder wählt für dich eine Aufgabe aus. Du wirst benachrichtigt, sobald eine Aufgabe zugewiesen wurde.', + 'COMMUNITY': '🗳️ Die Community stimmt ab, welche Aufgabe du erhältst. Das Ergebnis steht in einer Stunde fest.', + 'RANDOM': '🎲 Da es sich um ein Test-Lock handelt, wird nach einer Stunde automatisch eine zufällige Aufgabe ausgewählt.', + }; + document.getElementById('drawTaskPendingText').textContent = msgs[dto.taskPending] || ''; + document.getElementById('drawTaskPendingHint').style.display = ''; + } + if (dto.card === 'GREEN') { green.classList.add('visible'); document.getElementById('btnDrawOk').style.display = 'none'; @@ -1213,6 +1461,7 @@ // ── Lock beenden ── function lockBeendenFragen() { + document.getElementById('warnModalUnlockCode').textContent = _currentLock ? (_currentLock.unlockCode || '–') : '–'; document.getElementById('warnModal').classList.add('open'); } diff --git a/xxxthegame/src/main/resources/static/audio/message.mp3 b/xxxthegame/src/main/resources/static/audio/message.mp3 new file mode 100644 index 0000000..263d334 Binary files /dev/null and b/xxxthegame/src/main/resources/static/audio/message.mp3 differ diff --git a/xxxthegame/src/main/resources/static/audio/notification.mp3 b/xxxthegame/src/main/resources/static/audio/notification.mp3 new file mode 100644 index 0000000..0b94f07 Binary files /dev/null and b/xxxthegame/src/main/resources/static/audio/notification.mp3 differ diff --git a/xxxthegame/src/main/resources/static/benachrichtigungen.html b/xxxthegame/src/main/resources/static/benachrichtigungen.html new file mode 100644 index 0000000..4a8d5ef --- /dev/null +++ b/xxxthegame/src/main/resources/static/benachrichtigungen.html @@ -0,0 +1,251 @@ + + + + + + Benachrichtigungen – XXX The Game + + + + + +
+
+
+

🔔 Benachrichtigungen

+ +
+ +
+ +
+
+
+ + + + + + diff --git a/xxxthegame/src/main/resources/static/communityvotes.html b/xxxthegame/src/main/resources/static/communityvotes.html index fb7f345..1c5d03e 100644 --- a/xxxthegame/src/main/resources/static/communityvotes.html +++ b/xxxthegame/src/main/resources/static/communityvotes.html @@ -113,6 +113,78 @@ font-size: 0.88rem; } + /* Task Vote Section */ + .task-vote-section { + margin-bottom: 2rem; + } + .task-vote-section-title { + font-size: 1rem; + font-weight: 700; + margin-bottom: 0.75rem; + color: var(--color-primary); + } + .task-vote-card { + background: var(--color-card); + border: 1px solid rgba(52,152,219,0.35); + border-radius: 10px; + padding: 0.85rem 1rem; + margin-bottom: 0.75rem; + } + .task-vote-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.5rem; + } + .task-vote-lockee { + font-weight: 600; + font-size: 0.92rem; + } + .task-vote-expires { + font-size: 0.78rem; + color: var(--color-muted); + } + .task-vote-options { + display: flex; + flex-direction: column; + gap: 0.35rem; + margin-top: 0.5rem; + } + .task-vote-btn { + display: flex; + justify-content: space-between; + align-items: center; + background: rgba(52,152,219,0.08); + border: 1px solid rgba(52,152,219,0.25); + border-radius: 7px; + padding: 0.45rem 0.7rem; + cursor: pointer; + color: var(--color-text); + text-align: left; + font-size: 0.85rem; + transition: background 0.15s, border-color 0.15s; + width: 100%; + margin: 0; + } + .task-vote-btn:hover:not(:disabled) { + background: rgba(52,152,219,0.22); + border-color: rgba(52,152,219,0.5); + } + .task-vote-btn.my-vote { + border-color: var(--color-primary); + background: rgba(52,152,219,0.18); + } + .task-vote-btn:disabled { + cursor: default; + } + .task-vote-count { + font-size: 0.78rem; + color: var(--color-muted); + white-space: nowrap; + margin-left: 0.5rem; + flex-shrink: 0; + } + .empty-hint { color: var(--color-muted); font-size: 0.9rem; @@ -133,7 +205,16 @@
Community Votes
-
Verifikationen - stimme ab
+
Verifikationen & Aufgaben-Abstimmungen
+ + + + +
Verifikationen
+
Stimme ab, ob die Verifikation gültig ist
@@ -146,6 +227,83 @@ diff --git a/xxxthegame/src/main/resources/static/css/style.css b/xxxthegame/src/main/resources/static/css/style.css index fdeccf7..22e8feb 100644 --- a/xxxthegame/src/main/resources/static/css/style.css +++ b/xxxthegame/src/main/resources/static/css/style.css @@ -331,7 +331,7 @@ body.app { /* ── Social Sidebar ── */ .social-sidebar { - width: 220px; + width: 260px; flex-shrink: 0; background: var(--color-card); border: 1px solid var(--color-secondary); diff --git a/xxxthegame/src/main/resources/static/einladungen.html b/xxxthegame/src/main/resources/static/einladungen.html index eecd9e9..b8edbf5 100644 --- a/xxxthegame/src/main/resources/static/einladungen.html +++ b/xxxthegame/src/main/resources/static/einladungen.html @@ -33,13 +33,7 @@ .tab-panel { display: none; } .tab-panel.active { display: block; } - /* Sektionen */ - .inv-section { margin-bottom: 2rem; } - .inv-section-title { - font-size: 0.8rem; font-weight: 700; color: var(--color-primary); - text-transform: uppercase; letter-spacing: 0.06em; - margin-bottom: 0.75rem; - } + /* Liste */ .inv-list { display: flex; flex-direction: column; gap: 0.5rem; } .inv-card { @@ -49,21 +43,60 @@ display: flex; align-items: center; gap: 0.9rem; padding: 0.75rem 1rem; } + + /* Avatar mit Typ-Badge */ + .inv-avatar-wrap { + position: relative; + flex-shrink: 0; + } .inv-avatar { width: 52px; height: 52px; border-radius: 50%; background: var(--color-secondary); display: flex; align-items: center; justify-content: center; - font-size: 1.4rem; flex-shrink: 0; overflow: hidden; + font-size: 1.4rem; overflow: hidden; border: 1px solid rgba(255,255,255,0.08); } .inv-avatar img { width: 100%; height: 100%; object-fit: cover; } + .inv-type-badge { + position: absolute; + top: -6px; left: -6px; + width: 26px; height: 26px; + background: var(--color-card); + border: 1px solid var(--color-secondary); + border-radius: 50%; + display: flex; align-items: center; justify-content: center; + font-size: 1.08rem; + z-index: 1; + box-shadow: 0 1px 3px rgba(0,0,0,0.4); + } + .inv-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 0.15rem; } .inv-line1 { font-size: 0.78rem; color: var(--color-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .inv-line2 { font-weight: 700; font-size: 0.95rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .inv-line3 { font-size: 0.78rem; color: var(--color-muted); } .empty-hint { color: var(--color-muted); font-size: 0.9rem; margin-top: 0.25rem; } + /* Paging */ + .paging-bar { + display: flex; + align-items: center; + justify-content: center; + gap: 0.75rem; + margin-top: 1rem; + font-size: 0.88rem; + color: var(--color-muted); + } + .paging-bar button { + width: auto; + padding: 0.4rem 0.9rem; + font-size: 0.85rem; + } + .paging-bar button:disabled { + opacity: 0.35; + cursor: default; + } + /* Lockee-Einladungs-Dialog */ .lockee-dialog-bg { display: none; position: fixed; inset: 0; z-index: 400; @@ -166,30 +199,16 @@
-
-
Lockee-Einladungen
-
- -
-
-
Keyholder-Einladungen
-
- -
+
+ +
-
-
Gesendete Lockee-Einladungen
-
- -
-
-
Gesendete Keyholder-Einladungen
-
- -
+
+ +
@@ -198,6 +217,7 @@
+
🔒
@@ -237,6 +257,7 @@
+ diff --git a/xxxthegame/src/main/resources/static/joinlock.html b/xxxthegame/src/main/resources/static/joinlock.html index 9bdbd99..a261673 100644 --- a/xxxthegame/src/main/resources/static/joinlock.html +++ b/xxxthegame/src/main/resources/static/joinlock.html @@ -251,7 +251,7 @@ function showUnlockCodeModal(code, lid) { document.getElementById('unlockCodeDisplay').textContent = code; - const url = '/sessionchastityingame.html?lockId=' + lid; + const url = '/activelock.html?lockId=' + lid; const btn = document.getElementById('unlockModalBtn'); btn.onclick = () => startCodeScramble(code, url); document.getElementById('unlockModal').classList.add('open'); diff --git a/xxxthegame/src/main/resources/static/js/card-defs.js b/xxxthegame/src/main/resources/static/js/card-defs.js new file mode 100644 index 0000000..674f81d --- /dev/null +++ b/xxxthegame/src/main/resources/static/js/card-defs.js @@ -0,0 +1,70 @@ +/** + * Zentrale Kartendefinitionen für das Chastity Game. + * + * Exportiert (global): + * CARD_DEFS – Array mit { id, img, name, desc, defMin, defMax } + * CARD_LABELS – Object { ID: { name, img, desc } } (Lookup für card-display.js u.a.) + */ +const CARD_DEFS = [ + { + id: 'RED', + img: '/img/card_red.png', + name: 'Rote Karte', + desc: 'Niete - Viel Erfolg beim nächsten Zug', + defMin: 5, + defMax: 10, + }, + { + id: 'GREEN', + img: '/img/card_green.png', + name: 'Grüne Karte', + desc: 'Öffnet das Lock. Kann wieder ins Deck zurück gelegt werden', + defMin: 1, + defMax: 2, + }, + { + id: 'YELLOW', + img: '/img/card_yellow.png', + name: 'Gelbe Karte', + desc: 'Per Zufall werden rote Karten entfernt oder hinzugefügt', + defMin: 1, + defMax: 2, + }, + { + id: 'TASK', + img: '/img/card_task.png', + name: 'Aufgabe', + desc: 'Keyholder*In, Community oder der Zufall teilt eine Aufgabe zu.', + defMin: 0, + defMax: 0, + }, + { + id: 'FREEZE', + img: '/img/card_freeze.png', + name: 'Freeze', + desc: 'Friert das Lock für eine festgelegte Zeit ein – in diesem Zeitraum können keine Karten gezogen werden.', + defMin: 0, + defMax: 0, + }, + { + id: 'RESET', + img: '/img/card_reset.png', + name: 'Reset', + desc: 'Setzt das Kartendeck auf den Ausgangszustand zurück. Alle bisher gezogenen Karten kommen wieder rein.', + defMin: 0, + defMax: 0, + }, + { + id: 'DOUBLE_UP', + img: '/img/card_doubleup.png', + name: 'Double Up', + desc: 'Verdoppelt alle noch im Deck vorhandenen Karten.', + defMin: 0, + defMax: 0, + }, +]; + +/** Lookup-Objekt für Konsumenten, die nach ID auf Name/Bild/Beschreibung zugreifen. */ +const CARD_LABELS = Object.fromEntries( + CARD_DEFS.map(c => [c.id, { name: c.name, img: c.img, desc: c.desc }]) +); diff --git a/xxxthegame/src/main/resources/static/js/card-display.js b/xxxthegame/src/main/resources/static/js/card-display.js index 7949f3c..e55ba9e 100644 --- a/xxxthegame/src/main/resources/static/js/card-display.js +++ b/xxxthegame/src/main/resources/static/js/card-display.js @@ -1,6 +1,7 @@ /** * Gemeinsame Kartenanzeige für Chastity Game. - * Exportiert: CARD_LABELS, cardTypeGridHtml(cardCounts) + * Benötigt: /js/card-defs.js (CARD_LABELS muss bereits global verfügbar sein) + * Exportiert: cardTypeGridHtml(cardCounts) */ (function () { const style = document.createElement('style'); @@ -35,16 +36,6 @@ document.head.appendChild(style); })(); -const CARD_LABELS = { - RED: { name: 'Rote Karte', img: '/img/card_red.png', desc: 'Verlängert die Sperrzeit. Je nach Konfiguration werden Minuten oder Stunden auf den Timer addiert.' }, - GREEN: { name: 'Grüne Karte', img: '/img/card_green.png', desc: 'Verkürzt die Sperrzeit. Eine grüne Karte bringt dich dem Öffnen näher.' }, - YELLOW: { name: 'Gelbe Karte', img: '/img/card_yellow.png', desc: 'Neutrales Ereignis – keine Zeitveränderung, aber es passiert trotzdem etwas.' }, - TASK: { name: 'Aufgabe', img: '/img/card_task.png', desc: 'Teilt dir eine zufällige Aufgabe aus der Aufgabenliste zu. Die Aufgabe muss erfüllt werden.' }, - FREEZE: { name: 'Freeze', img: '/img/card_freeze.png', desc: 'Friert das Lock für eine festgelegte Zeit ein – in diesem Zeitraum können keine Karten gezogen werden.' }, - RESET: { name: 'Reset', img: '/img/card_reset.png', desc: 'Setzt das Kartendeck auf den Ausgangszustand zurück. Alle bisher gezogenen Karten kommen wieder rein.' }, - DOUBLE_UP: { name: 'Double Up', img: '/img/card_doubleup.png', desc: 'Verdoppelt alle Karten im aktuellen Deck.' }, -}; - /** * Gibt HTML für ein Karten-Typ-Raster zurück (ein Bild pro Typ, Anzahl-Badge). * @param {Object} cardCounts – { RED: 3, GREEN: 1, … } diff --git a/xxxthegame/src/main/resources/static/js/sidebar.js b/xxxthegame/src/main/resources/static/js/sidebar.js index bd5048d..95863ab 100644 --- a/xxxthegame/src/main/resources/static/js/sidebar.js +++ b/xxxthegame/src/main/resources/static/js/sidebar.js @@ -27,11 +27,12 @@ icon: '⊗', items: [ { href: '/infochastity.html', icon: 'ℹ', label: 'Info' }, - { href: '/sessionchastity.html', icon: '▷', label: 'Neues Lock', id: 'navChastityNeu' }, + { href: '/neulock.html', icon: '▷', label: 'Neues Lock', id: 'navChastityNeu' }, { href: '#', icon: '▶', label: 'Aktives Lock', id: 'navChastityAktiv' }, { href: '/communityvotes.html', icon: '🗳️', label: 'Community Votes' }, { href: '/meine-locks.html', icon: '🔒', label: 'Meine Locks' }, { href: '/keyholder.html', icon: '🔑', label: 'Keyholder' }, + { href: '/unlock-history.html', icon: '🗝️', label: 'Code-Historie' }, ] }, ]; @@ -125,7 +126,7 @@ const lockId = lockData.lockId; if (navCAktiv) { navCAktiv.style.display = ''; - navCAktiv.querySelector('a').href = '/sessionchastityingame.html?lockId=' + lockId; + navCAktiv.querySelector('a').href = '/activelock.html?lockId=' + lockId; } } } catch (_) { /* Menü bleibt im Standardzustand */ } diff --git a/xxxthegame/src/main/resources/static/js/social-sidebar.js b/xxxthegame/src/main/resources/static/js/social-sidebar.js index 91b7b1d..f8e86b2 100644 --- a/xxxthegame/src/main/resources/static/js/social-sidebar.js +++ b/xxxthegame/src/main/resources/static/js/social-sidebar.js @@ -5,12 +5,13 @@ const path = window.location.pathname; const links = [ - { href: '/feed.html', icon: '📰', label: 'Feed', badgeId: null, mobileBadgeId: null }, - { href: '/personen-suchen.html', icon: '⊕', label: 'Personen suchen', badgeId: null, mobileBadgeId: null }, - { href: '/freunde.html', icon: '♡', label: 'Freunde', badgeId: 'socialFriendsBadge', mobileBadgeId: 'socialMobileFriendsBadge' }, - { href: '/nachrichten.html', icon: '✉', label: 'Nachrichten', badgeId: 'socialMsgBadge', mobileBadgeId: 'socialMobileMsgBadge' }, - { href: '/gruppen.html', icon: '👥', label: 'Gruppen', badgeId: 'socialGruppenBadge', mobileBadgeId: 'socialMobileGruppenBadge' }, - { href: '/einladungen.html', icon: '✉', label: 'Einladungen', badgeId: 'socialInvBadge', mobileBadgeId: 'socialMobileInvBadge' }, + { href: '/feed.html', icon: '📰', label: 'Feed', badgeId: null, mobileBadgeId: null }, + { href: '/personen-suchen.html', icon: '⊕', label: 'Personen suchen', badgeId: null, mobileBadgeId: null }, + { href: '/freunde.html', icon: '♡', label: 'Freunde', badgeId: 'socialFriendsBadge', mobileBadgeId: 'socialMobileFriendsBadge' }, + { href: '/nachrichten.html', icon: '✉', label: 'Nachrichten', badgeId: 'socialMsgBadge', mobileBadgeId: 'socialMobileMsgBadge' }, + { href: '/benachrichtigungen.html', icon: '🔔', label: 'Benachrichtigungen', badgeId: 'socialNotifBadge', mobileBadgeId: 'socialMobileNotifBadge' }, + { href: '/gruppen.html', icon: '👥', label: 'Gruppen', badgeId: 'socialGruppenBadge', mobileBadgeId: 'socialMobileGruppenBadge' }, + { href: '/einladungen.html', icon: '✉', label: 'Einladungen', badgeId: 'socialInvBadge', mobileBadgeId: 'socialMobileInvBadge' }, ]; const profileActive = (path === '/benutzer.html' || path === '/profile.html') ? ' class="active"' : ''; @@ -102,6 +103,23 @@ }); } + // ── Ton abspielen ── + // Browser erlauben audio.play() sobald der Nutzer mindestens einmal interagiert hat. + let userHasInteracted = false; + document.addEventListener('click', () => { userHasInteracted = true; }, { passive: true }); + document.addEventListener('keydown', () => { userHasInteracted = true; }, { passive: true }); + document.addEventListener('touchstart', () => { userHasInteracted = true; }, { passive: true }); + + function playSound(src) { + if (!userHasInteracted) return; + try { + const audio = new Audio(src); + audio.volume = 0.6; + audio.play().catch(() => {}); + } catch(e) {} + } + + // ── Initiale Badge-Counts laden ── fetch('/social/friends/pending/count') .then(r => r.ok ? r.json() : 0) .then(n => setBadge(['socialFriendsBadge', 'socialMobileFriendsBadge'], n)) @@ -112,6 +130,11 @@ .then(n => setBadge(['socialMsgBadge', 'socialMobileMsgBadge'], n)) .catch(() => {}); + fetch('/notifications/unread/count') + .then(r => r.ok ? r.json() : 0) + .then(n => setBadge(['socialNotifBadge', 'socialMobileNotifBadge'], n)) + .catch(() => {}); + Promise.all([ fetch('/gruppen/requests/pending/count').then(r => r.ok ? r.json() : 0).catch(() => 0), fetch('/gruppen/reports/pending/count').then(r => r.ok ? r.json() : 0).catch(() => 0) @@ -124,4 +147,41 @@ ]).then(([khInvs, lockeeInvs]) => setBadge(['socialInvBadge', 'socialMobileInvBadge'], khInvs.length + lockeeInvs.length) ).catch(() => {}); + + // ── SSE: Echtzeit-Push vom Server ── + function connectSse() { + const es = new EventSource('/events/stream'); + + es.addEventListener('DM', e => { + try { + const data = JSON.parse(e.data); + setBadge(['socialMsgBadge', 'socialMobileMsgBadge'], data.unreadCount || 0); + // Nur Ton abspielen wenn nicht gerade auf der Nachrichten-Seite + if (window.location.pathname !== '/nachrichten.html') { + playSound('/audio/message.mp3'); + } + // Nachrichten-Seite: sofortiges Laden neuer Nachrichten auslösen + if (typeof window.__sseOnDm === 'function') window.__sseOnDm(data); + } catch(ex) {} + }); + + es.addEventListener('NOTIFICATION', e => { + try { + const data = JSON.parse(e.data); + setBadge(['socialNotifBadge', 'socialMobileNotifBadge'], data.unreadCount || 0); + if (window.location.pathname !== '/benachrichtigungen.html') { + playSound('/audio/notification.mp3'); + } + if (typeof window.__sseOnNotification === 'function') window.__sseOnNotification(data); + } catch(ex) {} + }); + + es.onerror = () => { + es.close(); + // Nach 5 Sekunden neu verbinden + setTimeout(connectSse, 5000); + }; + } + + connectSse(); })(); diff --git a/xxxthegame/src/main/resources/static/keyholder.html b/xxxthegame/src/main/resources/static/keyholder.html index e63aa50..c93f38e 100644 --- a/xxxthegame/src/main/resources/static/keyholder.html +++ b/xxxthegame/src/main/resources/static/keyholder.html @@ -78,6 +78,28 @@ } .violation-item:last-child { border-bottom:none; } + /* Zeitpicker (für Freeze-Dialog) */ + .time-picker { display:flex; align-items:center; gap:0.5rem; } + .tp-seg { display:flex; flex-direction:column; align-items:center; gap:0.2rem; } + .tp-seg-row { display:flex; align-items:center; gap:0.25rem; } + .tp-seg button { + width:26px; height:26px; + background:var(--color-secondary); border:1px solid var(--color-muted); + border-radius:5px; cursor:pointer; font-size:1rem; font-weight:700; + color:var(--color-text); display:flex; align-items:center; justify-content:center; + padding:0; flex-shrink:0; + } + .tp-seg button:hover { background:var(--color-primary); color:#fff; border-color:var(--color-primary); } + .tp-seg input { + width:30px; text-align:center; + background:var(--color-secondary); border:1px solid var(--color-muted); + border-radius:4px; color:var(--color-text); + font-size:0.95rem; font-weight:600; font-family:monospace; + padding:0.18rem 0; box-sizing:border-box; + } + .tp-seg .tp-label { font-size:0.65rem; color:var(--color-muted); text-transform:uppercase; letter-spacing:0.04em; } + .tp-colon { font-size:1.1rem; font-weight:700; color:var(--color-muted); margin-bottom:1rem; } + @@ -130,6 +152,175 @@
+ + + + + + + + + + @@ -155,6 +346,7 @@ ? `
` : `
👤
`; const startDate = l.startTime ? new Date(l.startTime).toLocaleDateString('de-DE') : '–'; + const frozenBadge = l.isFrozenByKeyholder ? ' · ❄️ Eingefroren' : ''; const card = document.createElement('div'); card.className = 'lock-card'; card.dataset.lockId = l.lockId; @@ -164,7 +356,7 @@
${esc(l.lockeeName)}
${esc(l.lockName)}
-
🃏 ${l.totalCards} Karten · seit ${startDate}
+
🃏 ${l.totalCards} Karten · seit ${startDate}${frozenBadge}
@@ -181,17 +373,23 @@ document.querySelectorAll('#locksGrid .lock-card.open').forEach(c => c.classList.remove('open')); if (isOpen) return; card.classList.add('open'); - const body = card.querySelector('.lock-detail-body'); - if (body.dataset.loaded) return; + await reloadLockDetail(lockId); + } + + async function reloadLockDetail(lockId) { + const card = document.querySelector(`[data-lock-id="${lockId}"]`); + const body = card ? card.querySelector('.lock-detail-body') : null; try { const res = await fetch('/keyholder/as-keyholder/' + lockId); - if (!res.ok) { body.textContent = 'Fehler beim Laden.'; return; } + if (!res.ok) { if (body) body.textContent = 'Fehler beim Laden.'; return; } const d = await res.json(); lockDetailCache[lockId] = d; - body.innerHTML = buildDetailHtml(d); - body.dataset.loaded = '1'; - attachDetailListeners(body, lockId); - } catch(e) { body.textContent = 'Fehler beim Laden.'; } + if (body) { + body.innerHTML = buildDetailHtml(d); + body.dataset.loaded = '1'; + attachDetailListeners(body, lockId); + } + } catch(e) { if (body) body.textContent = 'Fehler beim Laden.'; } } function attachDetailListeners(body, lockId) { @@ -213,7 +411,7 @@ html += `
Verbleibende Karten (${d.totalCards})
`; html += cardTypeGridHtml(d.cardCounts || {}); - html += `
+ html += `
`; @@ -232,28 +430,131 @@ } html += `
`; - // Eingefroren - if (d.frozenUntill) { - const frozenUntil = new Date(d.frozenUntill); - if (frozenUntil > new Date()) { - html += `
-
Status
-
- Eingefroren bis - ${frozenUntil.toLocaleString('de-DE')} -
+ // Einfrieren-Sektion + { + const isFrozen = d.frozenUntill && new Date(d.frozenUntill) > new Date(); + html += `
Einfrieren
`; + if (isFrozen) { + const frozenUntil = new Date(d.frozenUntill); + const frozenLabel = d.isFrozenByKeyholder ? '❄️ Eingefroren bis' : '❄️ Eingefroren bis (Aufgabe)'; + html += `
+ ${frozenLabel} + ${frozenUntil.toLocaleString('de-DE')}
`; + if (d.isFrozenByKeyholder) { + html += `
+ +
`; + } + } else if (!d.currentTask) { + html += `
+ +
`; + } else { + html += `
StatusNicht eingefroren
`; } + html += `
`; } // Aktuelle Aufgabe if (d.currentTask) { + let remainingHtml = ''; + if (d.taskFrozenUntil && new Date(d.taskFrozenUntil) > new Date()) { + const secUntil = Math.max(0, Math.round((new Date(d.taskFrozenUntil) - Date.now()) / 1000)); + remainingHtml = `
⏱ Noch: ${fmtDuration(secUntil)}
`; + } + const taskDescHtml = d.currentTaskDescription + ? `
${esc(d.currentTaskDescription)}
` : ''; html += `
Aktuelle Aufgabe
-
${esc(d.currentTask)}
+
+
${esc(d.currentTask)}
+ ${taskDescHtml} + ${remainingHtml} +
`; } + // Aufgaben-Sektion + if (d.hasTasks) { + html += `
Aufgaben
`; + + // Ausstehende gestellte Aufgaben + const pending = d.pendingAssignedTasks || []; + if (pending.length > 0) { + pending.forEach(t => { + const gestellt = new Date(t.assignedAt).toLocaleString('de-DE', {day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'}); + const fällig = new Date(t.acceptDeadline).toLocaleString('de-DE', {day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'}); + const penParts = []; + if (t.penaltyFreezeMinutes > 0) penParts.push(`❄️ ${t.penaltyFreezeMinutes} Min. Freeze`); + if (t.penaltyRedCards > 0) penParts.push(`🔴 ${t.penaltyRedCards} rote Karte${t.penaltyRedCards > 1 ? 'n' : ''}`); + const penStr = penParts.length > 0 ? penParts.join(', ') : 'Keine Strafe'; + const tTitle = t.taskTitle || t.taskText || ''; + const tDescHtml = t.taskDescription + ? `
${esc(t.taskDescription)}
` : ''; + const tMinsHtml = t.taskMinutes > 0 + ? `
Zeit: ${t.taskMinutes} Min.
` : ''; + html += `
+
+
${esc(tTitle)}
+ ${tDescHtml} + ${tMinsHtml} +
Gestellt: ${gestellt}
+
Fällig bis: ${fällig}
+
Strafe: ${penStr}
+
+ +
`; + }); + } else { + html += `
Aktuell keine gestellten Aufgaben.
`; + } + + // Aufgabe stellen Button (max. 5 offene Aufgaben) + const pendingCount = (d.pendingAssignedTasks || []).length; + if (pendingCount < 5) { + html += `
+ + ${pendingCount}/5 gestellt +
`; + } else { + html += `
Maximale Anzahl offener Aufgaben (5) erreicht.
`; + } + + html += `
`; + } + + // Ausstehende Task-Karten-Entscheidungen (Keyholder-Modus) + if (d.taskCardMode === 'KEYHOLDER' && d.pendingTaskChoices && d.pendingTaskChoices.length > 0) { + html += `
+
🃏 Aufgaben-Auswahl ausstehend
+
+ Die Lockee hat eine Aufgaben-Karte gezogen. Wähle eine Aufgabe aus: +
`; + d.pendingTaskChoices.forEach(choice => { + const since = new Date(choice.createdAt).toLocaleString('de-DE', {day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'}); + html += `
+
Gezogen am: ${since}
+
`; + (choice.tasks || []).forEach(t => { + const desc = t.description ? `
${esc(t.description)}
` : ''; + const mins = t.minutes > 0 ? `⏱ ${t.minutes} Min.` : ''; + const descEscJs = (t.description || '').replace(/'/g, "\\'").replace(/\n/g, ' '); + const titleEscJs = t.title.replace(/'/g, "\\'"); + html += ``; + }); + html += `
`; + }); + html += `
`; + } + // Hygiene if (d.hygieneEnabled) { html += `
@@ -310,6 +611,41 @@
`; } + // Notfall-Entsperrung Banner + if (d.emergencyUnlockRequested && !d.keyholderRequestedUnlock) { + html += `
+ 🆘 +
+
Notfall-Entsperrung angefordert!
+
Deine Lockee bittet dringend um Freigabe des Locks. Reagiere innerhalb einer Stunde oder das Lock öffnet sich automatisch.
+
+ +
+
+
`; + } + + // Lock entsperren (ganz unten) + { + const alreadyRequested = !!d.keyholderRequestedUnlock; + html += `
Lock entsperren
`; + if (alreadyRequested) { + html += `
✅ Unlock wurde angefordert – die Lockee erhält beim nächsten Laden ihren Entsperrcode.
`; + } else { + html += ` +
+ +
`; + } + html += `
`; + } + return html; } @@ -317,12 +653,13 @@ function fmtDuration(seconds) { if (seconds <= 0) return 'Jetzt'; - const h = Math.floor(seconds / 3600); + const d = Math.floor(seconds / 86400); + const h = Math.floor((seconds % 86400) / 3600); const m = Math.floor((seconds % 3600) / 60); - const s = seconds % 60; + if (d > 0) return `${d}d ${h}h`; if (h > 0) return `${h}h ${m}m`; - if (m > 0) return `${m}m ${s}s`; - return `${s}s`; + if (m > 0) return `${m}m`; + return '< 1m'; } @@ -482,13 +819,613 @@ } catch(e) { btn.disabled = false; } } - // Modal bei Klick außerhalb schließen + // Modals bei Klick außerhalb / Esc schließen document.getElementById('cardEditModal').addEventListener('click', e => { if (e.target === e.currentTarget) closeCardModal(); }); + document.getElementById('assignTaskModal').addEventListener('click', e => { + if (e.target === e.currentTarget) closeAssignTaskModal(); + }); + document.getElementById('freezeModal').addEventListener('click', e => { + if (e.target === e.currentTarget) closeFreezeModal(); + }); + document.getElementById('unfreezeModal').addEventListener('click', e => { + if (e.target === e.currentTarget) closeUnfreezeModal(); + }); + document.addEventListener('keydown', e => { + if (e.key !== 'Escape') return; + if (document.getElementById('assignTaskModal').style.display === 'flex') closeAssignTaskModal(); + if (document.getElementById('freezeModal').style.display === 'flex') closeFreezeModal(); + if (document.getElementById('unfreezeModal').style.display === 'flex') closeUnfreezeModal(); + }); + + // ── Aufgabe stellen ── + + let assignTaskLockId = null; + let assignTaskSelectedIdx = null; + + function atTpChange(delta, seg) { + let d = parseInt(document.getElementById('at_d').value) || 0; + let h = parseInt(document.getElementById('at_h').value) || 0; + let m = parseInt(document.getElementById('at_m').value) || 0; + if (seg === 'm') m += delta; else if (seg === 'h') h += delta; else d += delta; + if (m >= 60) { h += Math.floor(m/60); m = m%60; } + if (m < 0) { const b = Math.ceil(-m/60); h -= b; m += b*60; } + if (h >= 24) { d += Math.floor(h/24); h = h%24; } + if (h < 0) { const b = Math.ceil(-h/24); d -= b; h += b*24; } + if (d < 0) d = 0; + document.getElementById('at_d').value = d; + document.getElementById('at_h').value = String(h).padStart(2,'0'); + document.getElementById('at_m').value = String(m).padStart(2,'0'); + } + + function atFreezeTpChange(delta, seg) { + let d = parseInt(document.getElementById('atf_d').value) || 0; + let h = parseInt(document.getElementById('atf_h').value) || 0; + let m = parseInt(document.getElementById('atf_m').value) || 0; + if (seg === 'm') m += delta; else if (seg === 'h') h += delta; else d += delta; + if (m >= 60) { h += Math.floor(m/60); m = m%60; } + if (m < 0) { const b = Math.ceil(-m/60); h -= b; m += b*60; } + if (h >= 24) { d += Math.floor(h/24); h = h%24; } + if (h < 0) { const b = Math.ceil(-h/24); d -= b; h += b*24; } + if (d < 0) d = 0; + document.getElementById('atf_d').value = d; + document.getElementById('atf_h').value = String(h).padStart(2,'0'); + document.getElementById('atf_m').value = String(m).padStart(2,'0'); + } + + function atTpToMinutes(prefix) { + return (parseInt(document.getElementById(prefix+'_d').value)||0) * 24*60 + + (parseInt(document.getElementById(prefix+'_h').value)||0) * 60 + + (parseInt(document.getElementById(prefix+'_m').value)||0); + } + + function atRedChange(delta) { + const inp = document.getElementById('atRedCount'); + let v = parseInt(inp.value) || 1; + v = Math.max(1, Math.min(20, v + delta)); + inp.value = v; + } + + function toggleAtFreezeFields() { + const on = document.getElementById('atPenaltyFreezeEnabled').checked; + const el = document.getElementById('atPenaltyFreezeFields'); + el.style.opacity = on ? '1' : '0.4'; + el.style.pointerEvents = on ? '' : 'none'; + } + + function toggleAtRedFields() { + const on = document.getElementById('atPenaltyRedEnabled').checked; + const el = document.getElementById('atPenaltyRedFields'); + el.style.opacity = on ? '1' : '0.4'; + el.style.pointerEvents = on ? '' : 'none'; + } + + let assignTaskComboActive = -1; + + function openAssignTaskModal(lockId) { + const d = lockDetailCache[lockId]; + if (!d || !d.taskList || d.taskList.length === 0) return; + assignTaskLockId = lockId; + assignTaskSelectedIdx = null; + + // Reset + document.getElementById('at_d').value = '0'; + document.getElementById('at_h').value = '01'; + document.getElementById('at_m').value = '00'; + document.getElementById('atf_d').value = '0'; + document.getElementById('atf_h').value = '04'; + document.getElementById('atf_m').value = '00'; + document.getElementById('atRedCount').value = '1'; + document.getElementById('atPenaltyFreezeEnabled').checked = false; + document.getElementById('atPenaltyRedEnabled').checked = false; + toggleAtFreezeFields(); + toggleAtRedFields(); + document.getElementById('assignTaskError').style.display = 'none'; + + // Combo zurücksetzen + const input = document.getElementById('assignTaskInput'); + const dropdown = document.getElementById('assignTaskDropdown'); + const hidden = document.getElementById('assignTaskHiddenIdx'); + input.value = ''; + hidden.value = ''; + dropdown.style.display = 'none'; + assignTaskComboActive = -1; + + // Alte Listener entfernen (Clone-Trick) + const newInput = input.cloneNode(true); + input.parentNode.replaceChild(newInput, input); + + function renderTaskDropdown(query) { + const q = query.toLowerCase().trim(); + const filtered = d.taskList + .map((t, i) => ({ t, i })) + .filter(({ t }) => (t.title || t.text || '').toLowerCase().includes(q)); + dropdown.innerHTML = ''; + assignTaskComboActive = -1; + if (filtered.length === 0) { + dropdown.innerHTML = `
Keine Treffer.
`; + } else { + filtered.forEach(({ t, i }) => { + const label = t.title || t.text || ''; + const div = document.createElement('div'); + div.style.cssText = 'padding:0.5rem 0.85rem;cursor:pointer;font-size:0.88rem;color:var(--color-text);'; + div.innerHTML = `
${esc(label)}
` + + (t.description ? `
${esc(t.description)}
` : '') + + (t.minutes ? `
Dauer: ${fmtDuration(t.minutes * 60)}
` : ''); + div.addEventListener('mouseover', () => { + dropdown.querySelectorAll('[data-combo]').forEach(el => el.style.background = ''); + div.style.background = 'var(--color-secondary)'; + }); + div.addEventListener('mouseout', () => div.style.background = ''); + div.dataset.combo = i; + div.addEventListener('mousedown', e => { + e.preventDefault(); + selectAssignTask(i, label); + }); + dropdown.appendChild(div); + }); + } + dropdown.style.display = ''; + } + + function selectAssignTask(idx, text) { + document.getElementById('assignTaskHiddenIdx').value = idx; + document.getElementById('assignTaskInput').value = text; + assignTaskSelectedIdx = idx; + dropdown.style.display = 'none'; + } + + newInput.addEventListener('input', () => { + document.getElementById('assignTaskHiddenIdx').value = ''; + assignTaskSelectedIdx = null; + renderTaskDropdown(newInput.value); + }); + newInput.addEventListener('focus', () => renderTaskDropdown(newInput.value)); + newInput.addEventListener('blur', () => setTimeout(() => { dropdown.style.display = 'none'; }, 150)); + newInput.addEventListener('keydown', e => { + const opts = dropdown.querySelectorAll('[data-combo]'); + if (dropdown.style.display === 'none' || opts.length === 0) return; + if (e.key === 'ArrowDown') { + e.preventDefault(); + assignTaskComboActive = Math.min(assignTaskComboActive + 1, opts.length - 1); + opts.forEach((o, i) => o.style.background = i === assignTaskComboActive ? 'var(--color-secondary)' : ''); + } else if (e.key === 'ArrowUp') { + e.preventDefault(); + assignTaskComboActive = Math.max(assignTaskComboActive - 1, 0); + opts.forEach((o, i) => o.style.background = i === assignTaskComboActive ? 'var(--color-secondary)' : ''); + } else if (e.key === 'Enter' && assignTaskComboActive >= 0) { + e.preventDefault(); + const chosen = opts[assignTaskComboActive]; + selectAssignTask(parseInt(chosen.dataset.combo), chosen.querySelector('div').textContent); + } else if (e.key === 'Escape') { + dropdown.style.display = 'none'; + } + }); + + document.getElementById('assignTaskModal').style.display = 'flex'; + newInput.focus(); + } + + function closeAssignTaskModal() { + document.getElementById('assignTaskModal').style.display = 'none'; + document.getElementById('assignTaskDropdown').style.display = 'none'; + assignTaskLockId = null; + assignTaskSelectedIdx = null; + } + + async function submitAssignTask() { + const errEl = document.getElementById('assignTaskError'); + errEl.style.display = 'none'; + if (assignTaskSelectedIdx === null) { + errEl.textContent = 'Bitte eine Aufgabe auswählen.'; + errEl.style.display = ''; + return; + } + const deadlineMinutes = atTpToMinutes('at'); + if (deadlineMinutes < 1) { + errEl.textContent = 'Bitte eine Annahme-Frist angeben.'; + errEl.style.display = ''; + return; + } + const freezeEnabled = document.getElementById('atPenaltyFreezeEnabled').checked; + const redEnabled = document.getElementById('atPenaltyRedEnabled').checked; + if (!freezeEnabled && !redEnabled) { + errEl.textContent = 'Bitte mindestens eine Strafe festlegen.'; + errEl.style.display = ''; + return; + } + const penaltyFreezeMinutes = freezeEnabled ? atTpToMinutes('atf') : null; + const penaltyRedCards = redEnabled ? parseInt(document.getElementById('atRedCount').value) || 1 : null; + + try { + const res = await fetch(`/keyholder/as-keyholder/${assignTaskLockId}/assign-task`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + taskIndex: assignTaskSelectedIdx, + acceptDeadlineMinutes: deadlineMinutes, + penaltyFreezeMinutes, + penaltyRedCards + }) + }); + if (res.ok || res.status === 204) { + const lockId = assignTaskLockId; + closeAssignTaskModal(); + await reloadLockDetail(lockId); + } else { + const data = await res.json().catch(() => ({})); + errEl.textContent = data.error || 'Fehler beim Stellen der Aufgabe.'; + errEl.style.display = ''; + } + } catch(e) { + errEl.textContent = 'Fehler beim Stellen der Aufgabe.'; + errEl.style.display = ''; + } + } + + // ── Lock entsperren ── + + function showUnlockConfirm(lockId) { + const el = document.getElementById('unlockConfirm_' + lockId); + if (!el) return; + el.innerHTML = ` +
+
Soll das Lock wirklich geöffnet werden?
+
+ + +
+
`; + } + + function hideUnlockConfirm(lockId) { + const el = document.getElementById('unlockConfirm_' + lockId); + if (!el) return; + el.innerHTML = ` + `; + } + + async function requestUnlock(lockId) { + try { + const res = await fetch(`/keyholder/as-keyholder/${lockId}/request-unlock`, { method: 'POST' }); + if (res.ok || res.status === 204) { + await reloadLockDetail(lockId); + } + } catch(e) { console.error(e); } + } + + // ── Einfrieren / Entfrieren ── + + let freezeTargetLockId = null; + let unfreezeTargetLockId = null; + + // Zeitpicker-Logik (Dauer) + function freezeTpChange(delta, seg) { + let d = parseInt(document.getElementById('freeze_d').value) || 0; + let h = parseInt(document.getElementById('freeze_h').value) || 0; + let m = parseInt(document.getElementById('freeze_m').value) || 0; + if (seg === 'm') m += delta; + else if (seg === 'h') h += delta; + else if (seg === 'd') d += delta; + if (m >= 60) { h += Math.floor(m / 60); m = m % 60; } + if (m < 0) { const b = Math.ceil(-m / 60); h -= b; m += b * 60; } + if (h >= 24) { d += Math.floor(h / 24); h = h % 24; } + if (h < 0) { const b = Math.ceil(-h / 24); d -= b; h += b * 24; } + if (d < 0) d = 0; + document.getElementById('freeze_d').value = d; + document.getElementById('freeze_h').value = String(h).padStart(2, '0'); + document.getElementById('freeze_m').value = String(m).padStart(2, '0'); + } + + function freezeTpToMinutes() { + const d = parseInt(document.getElementById('freeze_d').value) || 0; + const h = parseInt(document.getElementById('freeze_h').value) || 0; + const m = parseInt(document.getElementById('freeze_m').value) || 0; + return d * 24 * 60 + h * 60 + m; + } + + function openFreezeModal(lockId) { + freezeTargetLockId = lockId; + // Default: 4h + document.getElementById('freeze_d').value = '0'; + document.getElementById('freeze_h').value = '04'; + document.getElementById('freeze_m').value = '00'; + document.getElementById('freezeModalError').style.display = 'none'; + document.getElementById('freezeModal').style.display = 'flex'; + } + + function closeFreezeModal() { + document.getElementById('freezeModal').style.display = 'none'; + freezeTargetLockId = null; + } + + async function submitFreeze() { + const lockId = freezeTargetLockId; + const minutes = freezeTpToMinutes(); + const errEl = document.getElementById('freezeModalError'); + if (minutes < 1) { + errEl.textContent = 'Bitte eine Dauer von mindestens 1 Minute angeben.'; + errEl.style.display = ''; + return; + } + errEl.style.display = 'none'; + const frozenUntil = new Date(Date.now() + minutes * 60000).toISOString().slice(0, 19); + try { + const res = await fetch(`/keyholder/as-keyholder/${lockId}/freeze`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ frozenUntil }) + }); + if (res.ok || res.status === 204) { + closeFreezeModal(); + await reloadLockDetail(lockId); + } else { + const data = await res.json().catch(() => ({})); + errEl.textContent = data.error || 'Fehler beim Einfrieren.'; + errEl.style.display = ''; + } + } catch(e) { + errEl.textContent = 'Fehler beim Einfrieren.'; + errEl.style.display = ''; + } + } + + function openUnfreezeModal(lockId) { + unfreezeTargetLockId = lockId; + document.getElementById('unfreezeModal').style.display = 'flex'; + } + + function closeUnfreezeModal() { + document.getElementById('unfreezeModal').style.display = 'none'; + unfreezeTargetLockId = null; + } + + async function submitUnfreeze() { + const lockId = unfreezeTargetLockId; + try { + const res = await fetch(`/keyholder/as-keyholder/${lockId}/freeze`, { method: 'DELETE' }); + if (res.ok || res.status === 204) { + closeUnfreezeModal(); + await reloadLockDetail(lockId); + } + } catch(e) { console.error(e); } + } + + async function reloadLockDetail(lockId) { + const cardEl = document.querySelector(`[data-lock-id="${lockId}"]`); + if (!cardEl) return; + const body = cardEl.querySelector('.lock-detail-body'); + const detailRes = await fetch('/keyholder/as-keyholder/' + lockId); + if (detailRes.ok) { + const updated = await detailRes.json(); + lockDetailCache[lockId] = updated; + body.innerHTML = buildDetailHtml(updated); + body.dataset.loaded = '1'; + attachDetailListeners(body, lockId); + // Listenkarte line3 aktualisieren + const line3 = cardEl.querySelector('.lock-card-line3'); + if (line3) { + const startDate = updated.startTime ? new Date(updated.startTime).toLocaleDateString('de-DE') : '–'; + const frozenBadge = updated.isFrozenByKeyholder ? ' · ❄️ Eingefroren' : ''; + line3.textContent = `🃏 ${updated.totalCards} Karten · seit ${startDate}${frozenBadge}`; + } + } + } + + async function chooseTaskForLock(choiceId, taskIndex, lockId) { + try { + const res = await fetch(`/task-card/keyholder/choices/${choiceId}/choose/${taskIndex}`, { method: 'POST' }); + if (res.ok || res.status === 204) { + await reloadLockDetail(lockId); + } + } catch(e) { console.error(e); } + } + + async function deleteAssignedTask(lockId, taskId) { + try { + const res = await fetch(`/keyholder/as-keyholder/${lockId}/assigned-tasks/${taskId}`, { method: 'DELETE' }); + if (res.ok || res.status === 204) { + await reloadLockDetail(lockId); + } + } catch(e) { console.error(e); } + } + + // ── Aufgaben-Auswahl-Popup ───────────────────────────────────────────────── + let _pendingChoiceId = null; + let _pendingTaskIndex = null; + let _pendingLockId = null; + + function ctpFreezeTpChange(delta, seg) { + let d = parseInt(document.getElementById('ctpf_d').value) || 0; + let h = parseInt(document.getElementById('ctpf_h').value) || 0; + let m = parseInt(document.getElementById('ctpf_m').value) || 0; + if (seg === 'm') m += delta; else if (seg === 'h') h += delta; else d += delta; + if (m >= 60) { h += Math.floor(m/60); m = m%60; } + if (m < 0) { const b = Math.ceil(-m/60); h -= b; m += b*60; } + if (h >= 24) { d += Math.floor(h/24); h = h%24; } + if (h < 0) { const b = Math.ceil(-h/24); d -= b; h += b*24; } + if (d < 0) d = 0; + document.getElementById('ctpf_d').value = d; + document.getElementById('ctpf_h').value = String(h).padStart(2,'0'); + document.getElementById('ctpf_m').value = String(m).padStart(2,'0'); + } + + function ctpFreezeToMinutes() { + return (parseInt(document.getElementById('ctpf_d').value)||0) * 24*60 + + (parseInt(document.getElementById('ctpf_h').value)||0) * 60 + + (parseInt(document.getElementById('ctpf_m').value)||0); + } + + function ctpRedChange(delta) { + const inp = document.getElementById('ctpRedCount'); + let v = parseInt(inp.value) || 1; + v = Math.max(1, Math.min(20, v + delta)); + inp.value = v; + } + + function toggleCtpFreezeFields() { + const on = document.getElementById('ctpPenaltyFreezeEnabled').checked; + const el = document.getElementById('ctpPenaltyFreezeFields'); + el.style.opacity = on ? '1' : '0.4'; + el.style.pointerEvents = on ? '' : 'none'; + } + + function toggleCtpRedFields() { + const on = document.getElementById('ctpPenaltyRedEnabled').checked; + const el = document.getElementById('ctpPenaltyRedFields'); + el.style.opacity = on ? '1' : '0.4'; + el.style.pointerEvents = on ? '' : 'none'; + } + + function openChooseTaskPopup(choiceId, taskIndex, lockId, taskTitle, taskDesc, taskMinutes) { + _pendingChoiceId = choiceId; + _pendingTaskIndex = taskIndex; + _pendingLockId = lockId; + + document.getElementById('ctpTaskTitle').textContent = taskTitle; + document.getElementById('ctpTaskDesc').textContent = taskDesc || ''; + document.getElementById('ctpTaskDesc').style.display = taskDesc ? '' : 'none'; + document.getElementById('ctpTaskMins').textContent = taskMinutes > 0 ? `⏱ ${taskMinutes} Min.` : ''; + + // Felder zurücksetzen + document.getElementById('ctpPenaltyFreezeEnabled').checked = false; + document.getElementById('ctpPenaltyRedEnabled').checked = false; + document.getElementById('ctpf_d').value = '0'; + document.getElementById('ctpf_h').value = '04'; + document.getElementById('ctpf_m').value = '00'; + document.getElementById('ctpRedCount').value = '1'; + toggleCtpFreezeFields(); + toggleCtpRedFields(); + + document.getElementById('ctpModal').style.display = 'flex'; + } + + function closeChooseTaskPopup() { + document.getElementById('ctpModal').style.display = 'none'; + _pendingChoiceId = _pendingTaskIndex = _pendingLockId = null; + } + + async function confirmChooseTask() { + if (!_pendingChoiceId) return; + const freezeEnabled = document.getElementById('ctpPenaltyFreezeEnabled').checked; + const redEnabled = document.getElementById('ctpPenaltyRedEnabled').checked; + + if (!freezeEnabled && !redEnabled) { + document.getElementById('ctpPenaltyError').style.display = ''; + return; + } + document.getElementById('ctpPenaltyError').style.display = 'none'; + + const freezeVal = freezeEnabled ? (ctpFreezeToMinutes() || null) : null; + const redVal = redEnabled ? (parseInt(document.getElementById('ctpRedCount').value) || null) : null; + try { + const res = await fetch( + `/task-card/keyholder/choices/${_pendingChoiceId}/choose/${_pendingTaskIndex}`, + { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ penaltyFreezeMinutes: freezeVal, penaltyRedCards: redVal }) + } + ); + if (res.ok || res.status === 204) { + closeChooseTaskPopup(); + await loadLocks(); + } + } catch(e) { console.error(e); } + } // Initial laden loadLocks(); + + // Automatische Aktualisierung alle 60 Sekunden für geöffnete Lock-Details + setInterval(() => { + document.querySelectorAll('#locksGrid .lock-card.open').forEach(card => { + const lockId = card.dataset.lockId; + if (lockId) reloadLockDetail(lockId); + }); + }, 60000); + + + diff --git a/xxxthegame/src/main/resources/static/meine-locks.html b/xxxthegame/src/main/resources/static/meine-locks.html index ea9b217..fa385c6 100644 --- a/xxxthegame/src/main/resources/static/meine-locks.html +++ b/xxxthegame/src/main/resources/static/meine-locks.html @@ -121,15 +121,27 @@ .tp-colon { font-size:1rem; font-weight:700; color:var(--color-muted); margin-bottom:0.9rem; } /* ── Aufgaben ── */ - .task-list { display:flex; flex-direction:column; gap:0.4rem; margin-bottom:0.6rem; } + .task-list { display:flex; flex-direction:column; gap:0.5rem; margin-bottom:0.6rem; } .task-item { - display:grid; grid-template-columns:1fr 70px auto; - gap:0.4rem; align-items:center; - background:var(--color-card); border-radius:7px; padding:0.5rem 0.6rem; + display:flex; flex-direction:column; + background:var(--color-card); border-radius:7px; padding:0.6rem 0.75rem; } + .task-item-row { + display:grid; grid-template-columns:1fr 80px auto; + gap:0.4rem; align-items:center; + } + .task-title-label { font-size:0.73rem; color:var(--color-muted); margin-bottom:0.1rem; } .task-item input[type="text"] { width:100%; box-sizing:border-box; } .task-item input[type="number"] { width:100%; box-sizing:border-box; text-align:center; } - .task-remove { background:none; border:none; color:rgba(200,50,50,0.7); cursor:pointer; font-size:0.95rem; padding:0; margin:0; width:auto; } + .task-item textarea { + resize:vertical; min-height:56px; margin-top:0.4rem; width:100%; box-sizing:border-box; + padding:0.55rem 0.9rem; border:1px solid var(--color-secondary); + border-radius:6px; background:var(--color-secondary); + color:var(--color-text); font-size:0.88rem; font-family:inherit; + outline:none; transition:border-color 0.2s; line-height:1.45; + } + .task-item textarea:focus { border-color:var(--color-primary); } + .task-remove { background:none; border:none; color:rgba(200,50,50,0.7); cursor:pointer; font-size:0.95rem; padding:0; margin:0; width:auto; align-self:center; } .task-remove:hover { color:#e74c3c; background:none; } .btn-add { background:none; border:1px dashed var(--color-muted); color:var(--color-muted); @@ -318,10 +330,29 @@
- + + + +
Aufgaben (optional)
-
Aufgaben werden zufällig bei Aufgaben-Karten zugeteilt.
+
@@ -346,29 +377,20 @@ + + + + + + + diff --git a/xxxthegame/src/main/resources/static/sessionchastity.html b/xxxthegame/src/main/resources/static/sessionchastity.html index edfdb5f..b949d09 100644 --- a/xxxthegame/src/main/resources/static/sessionchastity.html +++ b/xxxthegame/src/main/resources/static/sessionchastity.html @@ -2,1520 +2,7 @@ - - Chastity Game – Neues Lock – XXX The Game - - - + - -
-
- -

🔒 Neues Lock

- - - - - -
-
Grundeinstellungen
- -
- - -
- -
- -
- -
- -
-
Wähle dich selbst oder einen Freund als Lockee.
-
- - - -
- -
- -
- -
-
Ohne Keyholder läuft das Lock als Self-Lock
-
- -
- -
- - Zeilen -
-
Aus wie vielen Zeilen der Entsperrcode bestehen soll.
-
- -
- - -
Das Lock öffnet spätestens zu diesem Zeitpunkt automatisch.
-
- -
- - -
- -
- - -
-
- - -
-
Karten-Konfiguration
- - - -
- - -
- -
-
-
- - - -
- Tage -
-
:
-
-
- - - -
- Std -
-
:
-
-
- - - -
- Min -
-
-
- -
- - -
- -
- - -
-
- - -
-
Hygiene-Öffnungen (optional)
- -
- - -
- -
-
- -
-
-
- - - -
- Tage -
-
:
-
-
- - - -
- Std -
-
:
-
-
- - - -
- Min -
-
-
-
- -
-
-
- - - -
- Tage -
-
:
-
-
- - - -
- Std -
-
:
-
-
- - - -
- Min -
-
-
-
-
- - -
-
Aufgaben (optional)
-
- Aufgaben werden zufällig bei Aufgaben-Karten zugeteilt. Jede Aufgabe hat eine Beschreibung und eine Dauer in Minuten. -
-
- -
- - -
- -
- - -
- -
-
- - -
-
-
-
🔒
-

Dein Entsperrcode

-

- Stelle die Kombination deines Tresors auf den folgenden Code ein und verschließe deinen Schlüssel in diesem. -

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

-

- -
-
- - - - - - + diff --git a/xxxthegame/src/main/resources/static/unlock-history.html b/xxxthegame/src/main/resources/static/unlock-history.html new file mode 100644 index 0000000..52202ec --- /dev/null +++ b/xxxthegame/src/main/resources/static/unlock-history.html @@ -0,0 +1,86 @@ + + + + + + Code-Historie – XXX The Game + + + + + +
+

🗝️ Entsperrcode-Historie

+

Die letzten 10 Entsperrcodes, die dir angezeigt wurden.

+
+ Wird geladen… +
+
+ + + + +