1717package cn .enaium .joe .service .decompiler ;
1818
1919import cn .enaium .joe .JavaOctetEditor ;
20+ import cn .enaium .joe .jar .Jar ;
2021import cn .enaium .joe .util .MessageUtil ;
2122import cn .enaium .joe .util .classes .ClassNode ;
2223import cn .enaium .joe .util .classes .JarHelper ;
2930
3031
3132import java .io .ByteArrayInputStream ;
33+ import java .io .IOException ;
3234import java .io .InputStream ;
3335import java .util .*;
3436import java .util .jar .Manifest ;
3941 */
4042public class VineFlowerDecompiler extends IFernflowerLogger implements IDecompiler , IResultSaver , IContextSource , IContextSource .IOutputSink {
4143 private String returned ;
42- private HashMap <String , ClassNode > activeClass ;
44+ private ClassNode toDecompileClass ;
45+ private HashMap <String , ClassNode > classNodeHashMap ;
46+
4347 public static final CachedGlobalValue <Map <String , Object >> customProperties = new CachedGlobalValue <>(config -> {
4448 Map <String , String > map = JavaOctetEditor .getInstance ().CONFIG .getConfigMapStrings (config );
4549 HashMap <String , Object > hashMap = new HashMap <>(map .size ());
46- for (Map .Entry <String , String > entry : map .entrySet ()){
50+ for (Map .Entry <String , String > entry : map .entrySet ()) {
4751 String v = entry .getValue ();
4852 if (v .equals ("true" )) {
4953 v = "1" ;
@@ -52,21 +56,24 @@ public class VineFlowerDecompiler extends IFernflowerLogger implements IDecompil
5256 }
5357 hashMap .put (entry .getKey (), v );
5458 }
55- return Collections .unmodifiableMap (hashMap );});
59+ return Collections .unmodifiableMap (hashMap );
60+ });
5661
5762 @ Override
5863 public String decompile (final ClassNode classNode ) {
64+ toDecompileClass = classNode ;
65+ classNodeHashMap = JarHelper .getAllNodes (classNode );
5966 returned = null ;
60- activeClass = JarHelper .getAllNodes (classNode );
6167 BaseDecompiler baseDecompiler = new BaseDecompiler (this , customProperties .getValue (), this );
6268 baseDecompiler .addSource (this );
69+ baseDecompiler .addLibrary (new JarLibrary (JavaOctetEditor .getInstance ().getJar ()));
6370 baseDecompiler .decompileContext ();
6471 return returned ;
6572 }
6673
6774 @ Override
6875 public void saveClassFile (String path , String qualifiedName , String entryName , String content , int [] mapping ) {
69- if (returned == null ) {
76+ if (returned == null && toDecompileClass . getInternalName (). equals ( qualifiedName )) {
7077 returned = content ;
7178 }
7279 }
@@ -78,21 +85,21 @@ public void writeMessage(String message, Throwable t) {
7885
7986 @ Override
8087 public void writeMessage (String message , Severity severity ) {
81- switch (severity ){
88+ switch (severity ) {
8289 case INFO -> Logger .info (message );
8390 case WARN -> Logger .warn (message );
84- case TRACE -> Logger .trace (message );
85- case ERROR -> MessageUtil .error (message );
91+ // case TRACE -> Logger.trace(message);
92+ case ERROR -> Logger .error (message );
8693 }
8794 }
8895
8996 @ Override
9097 public void writeMessage (String message , Severity severity , Throwable t ) {
91- switch (severity ){
98+ switch (severity ) {
9299 case INFO -> Logger .info (t , message );
93100 case WARN -> Logger .warn (t , message );
94101 case TRACE -> Logger .trace (t , message );
95- case ERROR -> MessageUtil .error (message , t );
102+ case ERROR -> Logger .error (message , t );
96103 }
97104 }
98105
@@ -103,7 +110,7 @@ public String getName() {
103110
104111 @ Override
105112 public Entries getEntries () {
106- return new Entries (activeClass .keySet ().stream ().map (Entry ::atBase ).toList (), List .of (), List .of ());
113+ return new Entries (classNodeHashMap .keySet ().stream ().map (Entry ::atBase ).toList (), List .of (), List .of ());
107114 }
108115
109116 @ Override
@@ -113,19 +120,18 @@ public boolean isLazy() {
113120
114121 @ Override
115122 public InputStream getInputStream (String resource ) {
116- if (activeClass .containsKey (resource )) return new ByteArrayInputStream (activeClass .get (resource ).getClassBytes ());
117123 return null ;
118124 }
119125
120126 @ Override
121127 public byte [] getClassBytes (String className ) {
122- if (activeClass . containsKey (className )) return activeClass .get (className ).getClassBytes ();
128+ if (hasClass (className )) return classNodeHashMap .get (className ).getClassBytes ();
123129 return null ;
124130 }
125131
126132 @ Override
127133 public boolean hasClass (String className ) {
128- return activeClass .containsKey (className );
134+ return classNodeHashMap .containsKey (className );
129135 }
130136
131137 @ Override
@@ -135,18 +141,85 @@ public IOutputSink createOutputSink(IResultSaver saver) {
135141
136142 @ Override
137143 public void acceptClass (String qualifiedName , String fileName , String content , int [] mapping ) {
138- this .saveClassFile (null , null , null , content , mapping );
139- }
140-
141- @ Override public void begin () {}
142- @ Override public void close () {}
143- @ Override public void acceptDirectory (String s ) {}
144- @ Override public void acceptOther (String s ) {}
145- @ Override public void saveFolder (String path ) {}
146- @ Override public void copyFile (String source , String path , String entryName ) {}
147- @ Override public void createArchive (String path , String archiveName , Manifest manifest ) {}
148- @ Override public void saveDirEntry (String path , String archiveName , String entryName ) {}
149- @ Override public void copyEntry (String source , String path , String archiveName , String entry ) {}
150- @ Override public void saveClassEntry (String path , String archiveName , String qualifiedName , String entryName , String content ) {}
151- @ Override public void closeArchive (String path , String archiveName ) {}
144+ this .saveClassFile (null , qualifiedName , null , content , mapping );
145+ }
146+
147+ @ Override
148+ public void begin () {
149+ }
150+
151+ @ Override
152+ public void close () {
153+ }
154+
155+ @ Override
156+ public void acceptDirectory (String s ) {
157+ }
158+
159+ @ Override
160+ public void acceptOther (String s ) {
161+ }
162+
163+ @ Override
164+ public void saveFolder (String path ) {
165+ }
166+
167+ @ Override
168+ public void copyFile (String source , String path , String entryName ) {
169+ }
170+
171+ @ Override
172+ public void createArchive (String path , String archiveName , Manifest manifest ) {
173+ }
174+
175+ @ Override
176+ public void saveDirEntry (String path , String archiveName , String entryName ) {
177+ }
178+
179+ @ Override
180+ public void copyEntry (String source , String path , String archiveName , String entry ) {
181+ }
182+
183+ @ Override
184+ public void saveClassEntry (String path , String archiveName , String qualifiedName , String entryName , String content ) {
185+ }
186+
187+ @ Override
188+ public void closeArchive (String path , String archiveName ) {
189+ }
190+
191+ public static class JarLibrary implements IContextSource {
192+ protected Jar jar ;
193+
194+ public JarLibrary (Jar jar ) {
195+ this .jar = jar ;
196+ }
197+
198+ @ Override
199+ public String getName () {
200+ return "JavaOctetEditor Jar Library" ;
201+ }
202+
203+ @ Override
204+ public Entries getEntries () {
205+ return new Entries (jar .getClasses ().stream ().map (ClassNode ::getInternalName ).map (Entry ::atBase ).toList (), List .of (), List .of ());
206+ }
207+
208+ @ Override
209+ public InputStream getInputStream (String resource ) {
210+ return null ;
211+ }
212+
213+ @ Override
214+ public byte [] getClassBytes (String className ) {
215+ if (jar .hasClass (className )) jar .getClassNode (className ).getClassBytes ();
216+ return null ;
217+ }
218+
219+ @ Override
220+ public boolean hasClass (String className ) throws IOException {
221+ Logger .error ("has class? " + className );
222+ return jar .hasClass (className );
223+ }
224+ }
152225}
0 commit comments