Skip to content

Commit 12c9c35

Browse files
committed
Fixes #35, "Save All source dose not work"
1 parent 64442bb commit 12c9c35

File tree

7 files changed

+103
-57
lines changed

7 files changed

+103
-57
lines changed

api/src/main/java/org/jd/gui/spi/SourceSaver.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,19 @@ public interface SourceSaver {
2020

2121
public int getFileCount(API api, Container.Entry entry);
2222

23-
public void save(API api, Controller controller, Listener listener, Path path, Container.Entry entry);
23+
/**
24+
* Check parent path, build source file name, create NIO path and save the content.
25+
*/
26+
public void save(API api, Controller controller, Listener listener, Path rootPath, Container.Entry entry);
27+
28+
/**
29+
* Save content:
30+
* <ul>
31+
* <li>For file, save the source content.</li>
32+
* <li>For directory, call 'save' for each children.</li>
33+
* </ul>
34+
*/
35+
public void saveContent(API api, Controller controller, Listener listener, Path rootPath, Path path, Container.Entry entry);
2436

2537
public interface Controller {
2638
public boolean isCancelled();

app/src/main/groovy/org/jd/gui/service/mainpanel/ContainerPanelFactoryProvider.groovy

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,15 @@ import org.jd.gui.view.component.panel.TreeTabbedPanel
2222
import javax.swing.JComponent
2323
import javax.swing.tree.DefaultMutableTreeNode
2424
import javax.swing.tree.DefaultTreeModel
25+
import java.nio.file.FileSystems
26+
import java.nio.file.Files
2527
import java.nio.file.Path
2628

2729
class ContainerPanelFactoryProvider implements PanelFactory {
2830

29-
String[] getTypes() { ['default'] }
31+
@Override String[] getTypes() { ['default'] }
3032

33+
@Override
3134
public <T extends JComponent & UriGettable> T make(API api, Container container) {
3235
return new ContainerPanel(api, container)
3336
}
@@ -53,6 +56,7 @@ class ContainerPanelFactoryProvider implements PanelFactory {
5356
}
5457

5558
// --- ContentIndexable --- //
59+
@Override
5660
@CompileStatic
5761
Indexes index(API api) {
5862
// Classic map
@@ -71,40 +75,54 @@ class ContainerPanelFactoryProvider implements PanelFactory {
7175
}
7276
// Index populating value automatically
7377
def indexesWithDefault = new Indexes() {
74-
void waitIndexers() {}
75-
Map<String, Collection> getIndex(String name) {
76-
mapWithDefault.get(name)
77-
}
78+
@Override void waitIndexers() {}
79+
@Override Map<String, Collection> getIndex(String name) { mapWithDefault.get(name) }
7880
}
7981

8082
api.getIndexer(entry)?.index(api, entry, indexesWithDefault)
8183

8284
// To prevent memory leaks, return an index without the 'populate' behaviour
8385
return new Indexes() {
84-
void waitIndexers() {}
85-
Map<String, Collection> getIndex(String name) { map.get(name) }
86+
@Override void waitIndexers() {}
87+
@Override Map<String, Collection> getIndex(String name) { map.get(name) }
8688
}
8789
}
8890

8991
// --- SourcesSavable --- //
92+
@Override
9093
String getSourceFileName() {
9194
def path = api.getSourceSaver(entry)?.getSourcePath(entry)
9295
int index = path.lastIndexOf('/')
9396
return path.substring(index+1)
9497
}
9598

96-
int getFileCount() { api.getSourceSaver(entry)?.getFileCount(api, entry) }
99+
@Override int getFileCount() { api.getSourceSaver(entry)?.getFileCount(api, entry) }
97100

101+
@Override
98102
void save(API api, Controller controller, Listener listener, Path path) {
99-
api.getSourceSaver(entry)?.save(
103+
def parentPath = path.parent
104+
105+
if (parentPath && !Files.exists(parentPath)) {
106+
Files.createDirectories(parentPath)
107+
}
108+
109+
def uri = path.toUri()
110+
def archiveUri = new URI('jar:' + uri.scheme, uri.host, uri.path + '!/', null)
111+
def archiveFs = FileSystems.newFileSystem(archiveUri, [create: 'true'])
112+
def archiveRootPath = archiveFs.getPath('/')
113+
114+
api.getSourceSaver(entry)?.saveContent(
100115
api,
101116
new SourceSaver.Controller() {
102117
boolean isCancelled() { controller.isCancelled() }
103118
},
104119
new SourceSaver.Listener() {
105120
void pathSaved(Path p) { listener.pathSaved(p) }
106121
},
107-
path, entry)
122+
archiveRootPath, archiveRootPath, entry
123+
)
124+
125+
archiveFs.close()
108126
}
109127
}
110128
}

services/src/main/groovy/org/jd/gui/service/sourcesaver/DirectorySourceSaverProvider.groovy

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ class DirectorySourceSaverProvider extends AbstractSourceSaverProvider {
1818
/**
1919
* @return local + optional external selectors
2020
*/
21-
String[] getSelectors() { ['*:dir:*'] + externalSelectors }
21+
@Override String[] getSelectors() { ['*:dir:*'] + externalSelectors }
2222

23-
String getSourcePath(Container.Entry entry) { entry.path }
23+
@Override String getSourcePath(Container.Entry entry) { entry.path + '.src.zip' }
2424

25-
int getFileCount(API api, Container.Entry entry) { getFileCount(api, entry.children) }
25+
@Override int getFileCount(API api, Container.Entry entry) { getFileCount(api, entry.children) }
2626

2727
@CompileStatic
2828
protected int getFileCount(API api, Collection<Container.Entry> entries) {
@@ -35,26 +35,27 @@ class DirectorySourceSaverProvider extends AbstractSourceSaverProvider {
3535
return count
3636
}
3737

38-
void save(API api, SourceSaver.Controller controller, SourceSaver.Listener listener, Path path, Container.Entry entry) {
39-
save(api, controller, listener, path, entry.children)
40-
}
41-
38+
@Override
4239
@CompileStatic
43-
protected void save(API api, SourceSaver.Controller controller, SourceSaver.Listener listener, Path path, Collection<Container.Entry> entries) {
40+
public void save(API api, SourceSaver.Controller controller, SourceSaver.Listener listener, Path rootPath, Container.Entry entry) {
41+
Path path = rootPath.resolve(entry.getPath())
42+
4443
Files.createDirectories(path)
4544

46-
for (def e : entries) {
45+
saveContent(api, controller, listener, rootPath, path, entry);
46+
}
47+
48+
@Override
49+
@CompileStatic
50+
public void saveContent(API api, SourceSaver.Controller controller, SourceSaver.Listener listener, Path rootPath, Path path, Container.Entry entry) {
51+
for (def e : getChildren(entry)) {
4752
if (controller.isCancelled()) {
4853
break
4954
}
5055

51-
def saver = api.getSourceSaver(e)
52-
53-
if (saver) {
54-
def sp = saver.getSourcePath(e)
55-
def p = path.fileSystem.getPath(sp)
56-
saver.save(api, controller, listener, p, e)
57-
}
56+
api.getSourceSaver(e)?.save(api, controller, listener, rootPath, e)
5857
}
5958
}
59+
60+
protected Collection<Container.Entry> getChildren(Container.Entry entry) { entry.children }
6061
}

services/src/main/groovy/org/jd/gui/service/sourcesaver/FileSourceSaverProvider.groovy

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,21 @@ class FileSourceSaverProvider extends AbstractSourceSaverProvider {
1919
/**
2020
* @return local + optional external selectors
2121
*/
22-
String[] getSelectors() { ['*:file:*'] + externalSelectors }
22+
@Override String[] getSelectors() { ['*:file:*'] + externalSelectors }
2323

24-
String getSourcePath(Container.Entry entry) { entry.path }
24+
@Override String getSourcePath(Container.Entry entry) { entry.path }
2525

26-
int getFileCount(API api, Container.Entry entry) { 1 }
26+
@Override int getFileCount(API api, Container.Entry entry) { 1 }
2727

28+
@Override
2829
@CompileStatic
29-
void save(API api, SourceSaver.Controller controller, SourceSaver.Listener listener, Path path, Container.Entry entry) {
30+
public void save(API api, SourceSaver.Controller controller, SourceSaver.Listener listener, Path rootPath, Container.Entry entry) {
31+
saveContent(api, controller, listener, rootPath, rootPath.resolve(entry.getPath()), entry);
32+
}
33+
34+
@Override
35+
@CompileStatic
36+
void saveContent(API api, SourceSaver.Controller controller, SourceSaver.Listener listener, Path rootPath, Path path, Container.Entry entry) {
3037
listener.pathSaved(path)
3138

3239
entry.inputStream.withStream { InputStream is ->

services/src/main/groovy/org/jd/gui/service/sourcesaver/PackageSourceSaverProvider.groovy

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,17 @@
55

66
package org.jd.gui.service.sourcesaver
77

8-
import org.jd.gui.api.API
98
import org.jd.gui.api.model.Container
10-
import org.jd.gui.spi.SourceSaver
119
import org.jd.gui.util.JarContainerEntryUtil
1210

13-
import java.nio.file.Path
14-
1511
class PackageSourceSaverProvider extends DirectorySourceSaverProvider {
1612
/**
1713
* @return local + optional external selectors
1814
*/
19-
String[] getSelectors() { ['jar:dir:*', 'war:dir:*', 'ear:dir:*'] + externalSelectors }
15+
@Override String[] getSelectors() { ['jar:dir:*', 'war:dir:*', 'ear:dir:*'] + externalSelectors }
2016

21-
void save(API api, SourceSaver.Controller controller, SourceSaver.Listener listener, Path path, Container.Entry entry) {
22-
save(api, controller, listener, path, JarContainerEntryUtil.removeInnerTypeEntries(entry.children))
17+
@Override
18+
protected Collection<Container.Entry> getChildren(Container.Entry entry) {
19+
JarContainerEntryUtil.removeInnerTypeEntries(entry.children)
2320
}
2421
}

services/src/main/groovy/org/jd/gui/service/sourcesaver/ZipFileSourceSaverProvider.groovy

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,31 +20,32 @@ class ZipFileSourceSaverProvider extends DirectorySourceSaverProvider {
2020
/**
2121
* @return local + optional external selectors
2222
*/
23-
String[] getSelectors() { ['*:file:*.zip', '*:file:*.jar', '*:file:*.war', '*:file:*.ear'] + externalSelectors }
24-
25-
String getSourcePath(Container.Entry entry) { entry.path + '.src.zip' }
23+
@Override String[] getSelectors() { ['*:file:*.zip', '*:file:*.jar', '*:file:*.war', '*:file:*.ear'] + externalSelectors }
2624

25+
@Override
2726
@CompileStatic
28-
void save(API api, SourceSaver.Controller controller, SourceSaver.Listener listener, Path path, Container.Entry entry) {
27+
public void save(API api, SourceSaver.Controller controller, SourceSaver.Listener listener, Path rootPath, Container.Entry entry) {
28+
def sourcePath = getSourcePath(entry)
29+
def path = rootPath.resolve(sourcePath)
30+
def parentPath = path.parent
31+
32+
if (parentPath && !Files.exists(parentPath)) {
33+
Files.createDirectories(parentPath)
34+
}
35+
2936
def tmpFile = File.createTempFile('jd-gui.', '.tmp.zip')
3037
tmpFile.delete()
3138

32-
def env = new HashMap<String, String>()
33-
env.put('create', 'true')
34-
3539
def tmpFileUri = tmpFile.toURI()
36-
def tmpURI = new URI('jar:' + tmpFileUri.scheme, tmpFileUri.host, tmpFileUri.path + '!/', null)
37-
def tmpFs = FileSystems.newFileSystem(tmpURI, env);
40+
def tmpArchiveUri = new URI('jar:' + tmpFileUri.scheme, tmpFileUri.host, tmpFileUri.path + '!/', null)
41+
def tmpArchiveFs = FileSystems.newFileSystem(tmpArchiveUri, [create: 'true']);
42+
def tmpArchiveRootPath = tmpArchiveFs.getPath('/')
3843

39-
super.save(api, controller, listener, tmpFs.getPath('/'), entry)
40-
tmpFs.close()
44+
saveContent(api, controller, listener, tmpArchiveRootPath, tmpArchiveRootPath, entry)
4145

42-
def tmpPath = Paths.get(tmpFile.absolutePath)
43-
def srcZipParentPath = path.parent
46+
tmpArchiveFs.close()
4447

45-
if (srcZipParentPath && !Files.exists(srcZipParentPath)) {
46-
Files.createDirectories(srcZipParentPath)
47-
}
48+
def tmpPath = Paths.get(tmpFile.absolutePath)
4849

4950
Files.move(tmpPath, path)
5051
}

services/src/main/java/org/jd/gui/service/sourcesaver/ClassFileSourceSaverProvider.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package org.jd.gui.service.sourcesaver;
77

8-
import groovy.transform.CompileStatic;
98
import jd.core.CoreConstants;
109
import jd.core.Decompiler;
1110
import jd.core.process.DecompilerImpl;
@@ -41,6 +40,7 @@ public class ClassFileSourceSaverProvider extends AbstractSourceSaverProvider {
4140
/**
4241
* @return local + optional external selectors
4342
*/
43+
@Override
4444
public String[] getSelectors() {
4545
List<String> externalSelectors = getExternalSelectors();
4646

@@ -55,13 +55,15 @@ public String[] getSelectors() {
5555
}
5656
}
5757

58+
@Override
5859
public String getSourcePath(Container.Entry entry) {
5960
String path = entry.getPath();
6061
int index = path.lastIndexOf('.');
6162
String prefix = (index == -1) ? path : path.substring(0, index);
6263
return prefix + ".java";
6364
}
6465

66+
@Override
6567
public int getFileCount(API api, Container.Entry entry) {
6668
if (entry.getPath().indexOf('$') == -1) {
6769
return 1;
@@ -70,7 +72,16 @@ public int getFileCount(API api, Container.Entry entry) {
7072
}
7173
}
7274

73-
public void save(API api, Controller controller, Listener listener, Path path, Container.Entry entry) {
75+
@Override
76+
public void save(API api, Controller controller, Listener listener, Path rootPath, Container.Entry entry) {
77+
String sourcePath = getSourcePath(entry);
78+
Path path = rootPath.resolve(sourcePath);
79+
80+
saveContent(api, controller, listener, rootPath, path, entry);
81+
}
82+
83+
@Override
84+
public void saveContent(API api, Controller controller, Listener listener, Path rootPath, Path path, Container.Entry entry) {
7485
try {
7586
// Call listener
7687
if (path.toString().indexOf('$') == -1) {
@@ -137,7 +148,6 @@ public void save(API api, Controller controller, Listener listener, Path path, C
137148
}
138149
}
139150

140-
@CompileStatic
141151
protected static boolean getPreferenceValue(Map<String, String> preferences, String key, boolean defaultValue) {
142152
String v = preferences.get(key);
143153

0 commit comments

Comments
 (0)