summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joe2025-08-21 02:39:03 +0100
committerGravatar modmuss2025-09-13 09:14:23 +0100
commitb7427210851202a748ae0e25693f19e01b2afc4a (patch)
treec43d7e6ad91e262c651b49accf43c393493beda7
parentFix threading issues in ClassHandleProvider that are likely to come up if a p... (diff)
downloadenigma-fork-b7427210851202a748ae0e25693f19e01b2afc4a.tar.gz
enigma-fork-b7427210851202a748ae0e25693f19e01b2afc4a.tar.xz
enigma-fork-b7427210851202a748ae0e25693f19e01b2afc4a.zip
Add ProjectService to listen for the project lifecycle
-rw-r--r--enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java11
-rw-r--r--enigma/src/main/java/cuchaz/enigma/Enigma.java15
-rw-r--r--enigma/src/main/java/cuchaz/enigma/api/service/ProjectService.java13
3 files changed, 37 insertions, 2 deletions
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;
49import cuchaz.enigma.api.DataInvalidationEvent; 49import cuchaz.enigma.api.DataInvalidationEvent;
50import cuchaz.enigma.api.DataInvalidationListener; 50import cuchaz.enigma.api.DataInvalidationListener;
51import cuchaz.enigma.api.service.ObfuscationTestService; 51import cuchaz.enigma.api.service.ObfuscationTestService;
52import cuchaz.enigma.api.service.ProjectService;
52import cuchaz.enigma.api.view.GuiView; 53import cuchaz.enigma.api.view.GuiView;
53import cuchaz.enigma.api.view.entry.EntryReferenceView; 54import cuchaz.enigma.api.view.entry.EntryReferenceView;
54import cuchaz.enigma.classhandle.ClassHandle; 55import cuchaz.enigma.classhandle.ClassHandle;
@@ -133,11 +134,15 @@ public class GuiController implements ClientPacketHandler, GuiView, DataInvalida
133 this.gui.onStartOpenJar(); 134 this.gui.onStartOpenJar();
134 135
135 return ProgressDialog.runOffThread(gui.getFrame(), progress -> { 136 return ProgressDialog.runOffThread(gui.getFrame(), progress -> {
136 project = enigma.openJars(jarPaths, new ClasspathClassProvider(), progress); 137 project = enigma.openJars(jarPaths, new ClasspathClassProvider(), progress, false);
137 project.addDataInvalidationListener(this); 138 project.addDataInvalidationListener(this);
138 indexTreeBuilder = new IndexTreeBuilder(project.getJarIndex()); 139 indexTreeBuilder = new IndexTreeBuilder(project.getJarIndex());
139 chp = new ClassHandleProvider(project, UiConfig.getDecompiler().service); 140 chp = new ClassHandleProvider(project, UiConfig.getDecompiler().service);
140 SwingUtilities.invokeLater(() -> { 141 SwingUtilities.invokeLater(() -> {
142 for (ProjectService projectService : enigma.getServices().get(ProjectService.TYPE)) {
143 projectService.onProjectOpen(project);
144 }
145
141 gui.onFinishOpenJar(getFileNames(jarPaths)); 146 gui.onFinishOpenJar(getFileNames(jarPaths));
142 refreshClasses(); 147 refreshClasses();
143 }); 148 });
@@ -152,6 +157,10 @@ public class GuiController implements ClientPacketHandler, GuiView, DataInvalida
152 } 157 }
153 158
154 public void closeJar() { 159 public void closeJar() {
160 for (ProjectService projectService : enigma.getServices().get(ProjectService.TYPE)) {
161 projectService.onProjectClose(project);
162 }
163
155 this.chp.destroy(); 164 this.chp.destroy();
156 this.chp = null; 165 this.chp = null;
157 this.project = null; 166 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;
36import cuchaz.enigma.api.service.EnigmaServiceFactory; 36import cuchaz.enigma.api.service.EnigmaServiceFactory;
37import cuchaz.enigma.api.service.EnigmaServiceType; 37import cuchaz.enigma.api.service.EnigmaServiceType;
38import cuchaz.enigma.api.service.JarIndexerService; 38import cuchaz.enigma.api.service.JarIndexerService;
39import cuchaz.enigma.api.service.ProjectService;
39import cuchaz.enigma.classprovider.CachingClassProvider; 40import cuchaz.enigma.classprovider.CachingClassProvider;
40import cuchaz.enigma.classprovider.ClassProvider; 41import cuchaz.enigma.classprovider.ClassProvider;
41import cuchaz.enigma.classprovider.CombiningClassProvider; 42import cuchaz.enigma.classprovider.CombiningClassProvider;
@@ -71,6 +72,10 @@ public class Enigma {
71 } 72 }
72 73
73 public EnigmaProject openJars(List<Path> paths, ClassProvider libraryClassProvider, ProgressListener progress) throws IOException { 74 public EnigmaProject openJars(List<Path> paths, ClassProvider libraryClassProvider, ProgressListener progress) throws IOException {
75 return openJars(paths, libraryClassProvider, progress, true);
76 }
77
78 public EnigmaProject openJars(List<Path> paths, ClassProvider libraryClassProvider, ProgressListener progress, boolean callServices) throws IOException {
74 ClassProvider jarClassProvider = getJarClassProvider(paths); 79 ClassProvider jarClassProvider = getJarClassProvider(paths);
75 ClassProvider classProvider = new CachingClassProvider(new CombiningClassProvider(jarClassProvider, libraryClassProvider)); 80 ClassProvider classProvider = new CachingClassProvider(new CombiningClassProvider(jarClassProvider, libraryClassProvider));
76 Set<String> scope = Set.copyOf(jarClassProvider.getClassNames()); 81 Set<String> scope = Set.copyOf(jarClassProvider.getClassNames());
@@ -79,7 +84,15 @@ public class Enigma {
79 ClassProvider classProviderWithFrames = index.indexJar(scope, classProvider, progress); 84 ClassProvider classProviderWithFrames = index.indexJar(scope, classProvider, progress);
80 services.get(JarIndexerService.TYPE).forEach(indexer -> indexer.acceptJar(scope, classProviderWithFrames, index)); 85 services.get(JarIndexerService.TYPE).forEach(indexer -> indexer.acceptJar(scope, classProviderWithFrames, index));
81 86
82 return new EnigmaProject(this, paths, classProvider, index, Utils.zipSha1(paths.toArray(new Path[0]))); 87 EnigmaProject project = new EnigmaProject(this, paths, classProvider, index, Utils.zipSha1(paths.toArray(new Path[0])));
88
89 if (callServices) {
90 for (ProjectService projectService : services.get(ProjectService.TYPE)) {
91 projectService.onProjectOpen(project);
92 }
93 }
94
95 return project;
83 } 96 }
84 97
85 private ClassProvider getJarClassProvider(List<Path> jars) throws IOException { 98 private ClassProvider getJarClassProvider(List<Path> 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 @@
1package cuchaz.enigma.api.service;
2
3import cuchaz.enigma.api.view.ProjectView;
4
5public interface ProjectService extends EnigmaService {
6 EnigmaServiceType<ProjectService> TYPE = EnigmaServiceType.create("project");
7
8 default void onProjectOpen(ProjectView project) {
9 }
10
11 default void onProjectClose(ProjectView project) {
12 }
13}