Skip to content

Commit dfcf0bd

Browse files
committed
feat: Allow to export programs as ZIP
1 parent d731c03 commit dfcf0bd

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

src/main/java/me/coley/recaf/command/impl/Export.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import me.coley.recaf.command.ControllerCommand;
44
import me.coley.recaf.plugin.PluginsManager;
55
import me.coley.recaf.plugin.api.ExportInterceptorPlugin;
6+
import me.coley.recaf.util.IOUtil;
67
import me.coley.recaf.workspace.*;
78
import org.apache.commons.io.FileUtils;
89
import org.objectweb.asm.ClassReader;
@@ -17,6 +18,7 @@
1718
import java.util.jar.JarEntry;
1819
import java.util.jar.JarOutputStream;
1920
import java.util.stream.Collectors;
21+
import java.util.zip.ZipOutputStream;
2022

2123
import static me.coley.recaf.util.CollectionUtil.copySet;
2224
import static me.coley.recaf.util.Log.*;
@@ -122,7 +124,10 @@ public static void writeDirectory(File output, Map<String, byte[]> content) thro
122124
* When the jar file cannot be written to.
123125
*/
124126
public static void writeArchive(File output, Map<String, byte[]> content) throws IOException {
125-
try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(output))) {
127+
String extension = IOUtil.getExtension(output.toPath());
128+
FileOutputStream fos = new FileOutputStream(output);
129+
try (ZipOutputStream jos = ("zip".equals(extension)) ? new ZipOutputStream(fos) :
130+
/* Let's assume it's a jar */ new JarOutputStream(fos)) {
126131
Set<String> dirsVisited = new HashSet<>();
127132
// Contents is iterated in sorted order (because 'archiveContent' is TreeMap).
128133
// This allows us to insert directory entries before file entries of that directory occur.

src/main/java/me/coley/recaf/ui/MainMenu.java

+13-11
Original file line numberDiff line numberDiff line change
@@ -139,23 +139,25 @@ public MainMenu(GuiController controller) {
139139
}
140140
getMenus().addAll(mPlugins, mHelp);
141141
// Setup file-choosers
142-
ExtensionFilter filter = new ExtensionFilter(translate("ui.fileprompt.open.extensions"),
142+
ExtensionFilter commonFilter = new ExtensionFilter(translate("ui.fileprompt.open.extensions"),
143143
"*.jar", "*.war", "*.class", "*.json");
144+
ExtensionFilter saveFilter = new ExtensionFilter(translate("ui.fileprompt.open.extensions"),
145+
"*.jar", "*.war", "*.class", "*.zip");
144146
fcLoadApp.setTitle(translate("ui.fileprompt.open"));
145-
fcLoadApp.getExtensionFilters().add(filter);
146-
fcLoadApp.setSelectedExtensionFilter(filter);
147+
fcLoadApp.getExtensionFilters().add(commonFilter);
148+
fcLoadApp.setSelectedExtensionFilter(commonFilter);
147149
fcSaveApp.setTitle(translate("ui.fileprompt.export"));
148-
fcSaveApp.getExtensionFilters().add(filter);
149-
fcSaveApp.setSelectedExtensionFilter(filter);
150-
filter = new ExtensionFilter(translate("ui.fileprompt.open.extensions"),
150+
fcSaveApp.getExtensionFilters().add(saveFilter);
151+
fcSaveApp.setSelectedExtensionFilter(saveFilter);
152+
commonFilter = new ExtensionFilter(translate("ui.fileprompt.open.extensions"),
151153
"*.txt", "*.map", "*.mapping", "*.enigma", "*.pro", "*.srg", "*.tiny", "*.tinyv2");
152154
fcLoadMap.setTitle(translate("ui.fileprompt.open"));
153-
fcLoadMap.getExtensionFilters().add(filter);
154-
fcLoadMap.setSelectedExtensionFilter(filter);
155-
filter = new ExtensionFilter(translate("ui.fileprompt.open.extensions"), "*.json");
155+
fcLoadMap.getExtensionFilters().add(commonFilter);
156+
fcLoadMap.setSelectedExtensionFilter(commonFilter);
157+
commonFilter = new ExtensionFilter(translate("ui.fileprompt.open.extensions"), "*.json");
156158
fcSaveWorkspace.setTitle(translate("ui.fileprompt.export"));
157-
fcSaveWorkspace.getExtensionFilters().add(filter);
158-
fcSaveWorkspace.setSelectedExtensionFilter(filter);
159+
fcSaveWorkspace.getExtensionFilters().add(commonFilter);
160+
fcSaveWorkspace.setSelectedExtensionFilter(commonFilter);
159161
}
160162

161163
/**

0 commit comments

Comments
 (0)