From b7427210851202a748ae0e25693f19e01b2afc4a Mon Sep 17 00:00:00 2001 From: Joe Date: Thu, 21 Aug 2025 02:39:03 +0100 Subject: Add ProjectService to listen for the project lifecycle --- .../src/main/java/cuchaz/enigma/gui/GuiController.java | 11 ++++++++++- enigma/src/main/java/cuchaz/enigma/Enigma.java | 15 ++++++++++++++- .../java/cuchaz/enigma/api/service/ProjectService.java | 13 +++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 enigma/src/main/java/cuchaz/enigma/api/service/ProjectService.java diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java index a9795bc..9faa0d0 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -49,6 +49,7 @@ import cuchaz.enigma.analysis.StructureTreeOptions; import cuchaz.enigma.api.DataInvalidationEvent; import cuchaz.enigma.api.DataInvalidationListener; import cuchaz.enigma.api.service.ObfuscationTestService; +import cuchaz.enigma.api.service.ProjectService; import cuchaz.enigma.api.view.GuiView; import cuchaz.enigma.api.view.entry.EntryReferenceView; import cuchaz.enigma.classhandle.ClassHandle; @@ -133,11 +134,15 @@ public class GuiController implements ClientPacketHandler, GuiView, DataInvalida this.gui.onStartOpenJar(); return ProgressDialog.runOffThread(gui.getFrame(), progress -> { - project = enigma.openJars(jarPaths, new ClasspathClassProvider(), progress); + project = enigma.openJars(jarPaths, new ClasspathClassProvider(), progress, false); project.addDataInvalidationListener(this); indexTreeBuilder = new IndexTreeBuilder(project.getJarIndex()); chp = new ClassHandleProvider(project, UiConfig.getDecompiler().service); SwingUtilities.invokeLater(() -> { + for (ProjectService projectService : enigma.getServices().get(ProjectService.TYPE)) { + projectService.onProjectOpen(project); + } + gui.onFinishOpenJar(getFileNames(jarPaths)); refreshClasses(); }); @@ -152,6 +157,10 @@ public class GuiController implements ClientPacketHandler, GuiView, DataInvalida } public void closeJar() { + for (ProjectService projectService : enigma.getServices().get(ProjectService.TYPE)) { + projectService.onProjectClose(project); + } + this.chp.destroy(); this.chp = null; this.project = null; diff --git a/enigma/src/main/java/cuchaz/enigma/Enigma.java b/enigma/src/main/java/cuchaz/enigma/Enigma.java index 729a114..13640bc 100644 --- a/enigma/src/main/java/cuchaz/enigma/Enigma.java +++ b/enigma/src/main/java/cuchaz/enigma/Enigma.java @@ -36,6 +36,7 @@ import cuchaz.enigma.api.service.EnigmaService; import cuchaz.enigma.api.service.EnigmaServiceFactory; import cuchaz.enigma.api.service.EnigmaServiceType; import cuchaz.enigma.api.service.JarIndexerService; +import cuchaz.enigma.api.service.ProjectService; import cuchaz.enigma.classprovider.CachingClassProvider; import cuchaz.enigma.classprovider.ClassProvider; import cuchaz.enigma.classprovider.CombiningClassProvider; @@ -71,6 +72,10 @@ public class Enigma { } public EnigmaProject openJars(List paths, ClassProvider libraryClassProvider, ProgressListener progress) throws IOException { + return openJars(paths, libraryClassProvider, progress, true); + } + + public EnigmaProject openJars(List paths, ClassProvider libraryClassProvider, ProgressListener progress, boolean callServices) throws IOException { ClassProvider jarClassProvider = getJarClassProvider(paths); ClassProvider classProvider = new CachingClassProvider(new CombiningClassProvider(jarClassProvider, libraryClassProvider)); Set scope = Set.copyOf(jarClassProvider.getClassNames()); @@ -79,7 +84,15 @@ public class Enigma { ClassProvider classProviderWithFrames = index.indexJar(scope, classProvider, progress); services.get(JarIndexerService.TYPE).forEach(indexer -> indexer.acceptJar(scope, classProviderWithFrames, index)); - return new EnigmaProject(this, paths, classProvider, index, Utils.zipSha1(paths.toArray(new Path[0]))); + EnigmaProject project = new EnigmaProject(this, paths, classProvider, index, Utils.zipSha1(paths.toArray(new Path[0]))); + + if (callServices) { + for (ProjectService projectService : services.get(ProjectService.TYPE)) { + projectService.onProjectOpen(project); + } + } + + return project; } private ClassProvider getJarClassProvider(List jars) throws IOException { diff --git a/enigma/src/main/java/cuchaz/enigma/api/service/ProjectService.java b/enigma/src/main/java/cuchaz/enigma/api/service/ProjectService.java new file mode 100644 index 0000000..a9deefc --- /dev/null +++ b/enigma/src/main/java/cuchaz/enigma/api/service/ProjectService.java @@ -0,0 +1,13 @@ +package cuchaz.enigma.api.service; + +import cuchaz.enigma.api.view.ProjectView; + +public interface ProjectService extends EnigmaService { + EnigmaServiceType TYPE = EnigmaServiceType.create("project"); + + default void onProjectOpen(ProjectView project) { + } + + default void onProjectClose(ProjectView project) { + } +} -- cgit v1.2.3