From 29d1e46dd0f509022ad1268ea41f7185d34d9dfc Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 11 Jul 2019 20:50:14 +0200 Subject: [PATCH] [platform] migrates "prepare to deploy" action to Compressor API GitOrigin-RevId: 700fae9f0bc654d6074bb14920afa7eff1cb1749 --- .../src/build/PrepareToDeployAction.java | 170 ++++++++---------- 1 file changed, 75 insertions(+), 95 deletions(-) diff --git a/plugins/devkit/devkit-core/src/build/PrepareToDeployAction.java b/plugins/devkit/devkit-core/src/build/PrepareToDeployAction.java index e09077fb55ec..c751c5c4251c 100644 --- a/plugins/devkit/devkit-core/src/build/PrepareToDeployAction.java +++ b/plugins/devkit/devkit-core/src/build/PrepareToDeployAction.java @@ -30,7 +30,7 @@ import com.intellij.openapi.vfs.*; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.util.PathUtil; -import com.intellij.util.io.ZipUtil; +import com.intellij.util.io.Compressor; import com.intellij.util.xml.DomFileElement; import com.intellij.util.xml.DomManager; import org.jetbrains.annotations.NotNull; @@ -42,16 +42,12 @@ import org.jetbrains.idea.devkit.module.PluginModuleType; import java.io.*; import java.util.*; -import java.util.jar.JarOutputStream; import java.util.jar.Manifest; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; public class PrepareToDeployAction extends AnAction { private static final String ZIP_EXTENSION = ".zip"; private static final String JAR_EXTENSION = ".jar"; private static final String TEMP_PREFIX = "temp"; - private static final String MIDDLE_LIB_DIR = "lib"; private static final NotificationGroup NOTIFICATION_GROUP = NotificationGroup.balloonGroup("Plugin DevKit Deployment"); @@ -127,10 +123,15 @@ public class PrepareToDeployAction extends AnAction { try { File jarFile = preparePluginsJar(module, modules); if (isZip) { - processLibrariesAndJpsPlugins(jarFile, dstFile, pluginName, libs, jpsModules, progressIndicator); + try { + processLibrariesAndJpsPlugins(jarFile, dstFile, pluginName, libs, jpsModules); + } + finally { + FileUtil.delete(jarFile); + } } else { - FileUtil.copy(jarFile, dstFile); + FileUtil.rename(jarFile, dstFile); } LocalFileSystem.getInstance().refreshIoFiles(Collections.singleton(dstFile), true, false, null); successMessages.add(DevKitBundle.message("saved.message", isZip ? 1 : 2, pluginName, dstPath)); @@ -180,82 +181,76 @@ public class PrepareToDeployAction extends AnAction { return vfile == null || !ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(Collections.singleton(vfile)).hasReadonlyFiles(); } - private static FileFilter createFilter(final ProgressIndicator progressIndicator, @Nullable final FileTypeManager fileTypeManager) { - return pathName -> { - if (progressIndicator != null) { - progressIndicator.setText2(""); - } - return fileTypeManager == null || !fileTypeManager.isFileIgnored(FileUtil.toSystemIndependentName(pathName.getName())); - }; - } - private static void processLibrariesAndJpsPlugins(File jarFile, File zipFile, String pluginName, Set libs, - Map jpsModules, - ProgressIndicator progressIndicator) throws IOException { + Map jpsModules) throws IOException { if (FileUtil.ensureCanCreateFile(zipFile)) { - ZipOutputStream zos = null; - try { - zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile))); - addStructure(pluginName, zos); - addStructure(pluginName + "/" + MIDDLE_LIB_DIR, zos); - final String entryName = pluginName + JAR_EXTENSION; - ZipUtil.addFileToZip(zos, jarFile, getZipPath(pluginName, entryName), new HashSet<>(), - createFilter(progressIndicator, FileTypeManager.getInstance())); + try (Compressor zip = new Compressor.Zip(zipFile)) { + zip.addDirectory(getZipPath(pluginName, "")); + + Set usedJarNames = new HashSet<>(); + String entryName = pluginName + JAR_EXTENSION; + zip.addFile(getZipPath(pluginName, entryName), jarFile); + usedJarNames.add(entryName); + for (Map.Entry entry : jpsModules.entrySet()) { File jpsPluginJar = jarModulesOutput(Collections.singleton(entry.getKey()), null, null); - ZipUtil.addFileToZip(zos, jpsPluginJar, getZipPath(pluginName, entry.getValue()), null, null); + try { + zip.addFile(getZipPath(pluginName, entry.getValue()), jpsPluginJar); + } + finally { + FileUtil.delete(jpsPluginJar); + } } - Set usedJarNames = new HashSet<>(); - usedJarNames.add(entryName); + Set jarredVirtualFiles = new HashSet<>(); for (Library library : libs) { - final VirtualFile[] files = library.getFiles(OrderRootType.CLASSES); - for (VirtualFile virtualFile : files) { - if (jarredVirtualFiles.add(virtualFile)) { - if (virtualFile.getFileSystem() instanceof JarFileSystem) { - addLibraryJar(virtualFile, zipFile, pluginName, zos, usedJarNames, progressIndicator); + VirtualFile[] roots = library.getFiles(OrderRootType.CLASSES); + for (VirtualFile libRoot : roots) { + if (jarredVirtualFiles.add(libRoot)) { + if (libRoot.getFileSystem() instanceof JarFileSystem) { + addLibraryJar(libRoot, pluginName, zip, usedJarNames); } else { - makeAndAddLibraryJar(virtualFile, zipFile, pluginName, zos, usedJarNames, progressIndicator, library.getName()); + makeAndAddLibraryJar(libRoot, pluginName, zip, usedJarNames, library.getName()); } } } } } - finally { - if (zos != null) zos.close(); - } } } - private static String getZipPath(final String pluginName, final String entryName) { - return "/" + pluginName + "/" + MIDDLE_LIB_DIR + "/" + entryName; + private static String getZipPath(String pluginName, String entryName) { + return pluginName + "/lib/" + entryName; } - private static void makeAndAddLibraryJar(VirtualFile virtualFile, - File zipFile, + private static void addLibraryJar(VirtualFile root, String pluginName, Compressor zip, Set usedJarNames) throws IOException { + File ioFile = VfsUtilCore.virtualToIoFile(root); + String jarName = getLibraryJarName(ioFile.getName(), usedJarNames, null); + zip.addFile(getZipPath(pluginName, jarName), ioFile); + } + + private static void makeAndAddLibraryJar(VirtualFile root, String pluginName, - ZipOutputStream zos, + Compressor zip, Set usedJarNames, - ProgressIndicator progressIndicator, - String preferredName) throws IOException { - File libraryJar = FileUtil.createTempFile(TEMP_PREFIX, JAR_EXTENSION); - libraryJar.deleteOnExit(); - ZipOutputStream jar = null; + @Nullable String preferredName) throws IOException { + File tempFile = FileUtil.createTempFile(TEMP_PREFIX, JAR_EXTENSION); try { - jar = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(libraryJar))); - ZipUtil.addFileOrDirRecursively(jar, libraryJar, VfsUtilCore.virtualToIoFile(virtualFile), "", - createFilter(progressIndicator, FileTypeManager.getInstance()), null); + try (Compressor tempZip = new Compressor.Zip(tempFile)) { + FileTypeManager manager = FileTypeManager.getInstance(); + tempZip.filter((entryName, isDir) -> !manager.isFileIgnored(PathUtil.getFileName(entryName))); + tempZip.addDirectory(VfsUtilCore.virtualToIoFile(root)); + } + String jarName = getLibraryJarName(root.getName() + JAR_EXTENSION, usedJarNames, preferredName == null ? null : preferredName + JAR_EXTENSION); + zip.addFile(getZipPath(pluginName, jarName), tempFile); } finally { - if (jar != null) jar.close(); + FileUtil.delete(tempFile); } - String jarName = - getLibraryJarName(virtualFile.getName() + JAR_EXTENSION, usedJarNames, preferredName == null ? null : preferredName + JAR_EXTENSION); - ZipUtil.addFileOrDirRecursively(zos, zipFile, libraryJar, getZipPath(pluginName, jarName), createFilter(progressIndicator, null), null); } private static String getLibraryJarName(String fileName, Set usedJarNames, @Nullable String preferredName) { @@ -266,7 +261,7 @@ public class PrepareToDeployAction extends AnAction { else { uniqueName = fileName; if (usedJarNames.contains(uniqueName)) { - int dotPos = uniqueName.lastIndexOf("."); + int dotPos = uniqueName.lastIndexOf('.'); String name = dotPos < 0 ? uniqueName : uniqueName.substring(0, dotPos); String ext = dotPos < 0 ? "" : uniqueName.substring(dotPos); int i = 0; @@ -281,56 +276,41 @@ public class PrepareToDeployAction extends AnAction { return uniqueName; } - private static void addLibraryJar(VirtualFile virtualFile, - File zipFile, - String pluginName, - ZipOutputStream zos, - Set usedJarNames, - ProgressIndicator progressIndicator) throws IOException { - File ioFile = VfsUtilCore.virtualToIoFile(virtualFile); - String jarName = getLibraryJarName(ioFile.getName(), usedJarNames, null); - ZipUtil.addFileOrDirRecursively(zos, zipFile, ioFile, getZipPath(pluginName, jarName), createFilter(progressIndicator, null), null); - } - - private static void addStructure(final String relativePath, final ZipOutputStream zos) throws IOException { - ZipEntry e = new ZipEntry(relativePath + "/"); - e.setMethod(ZipEntry.STORED); - e.setSize(0); - e.setCrc(0); - zos.putNextEntry(e); - zos.closeEntry(); - } - private static File preparePluginsJar(Module module, Set modules) throws IOException { PluginBuildConfiguration configuration = PluginBuildConfiguration.getInstance(module); Manifest manifest = createOrFindManifest(configuration); return jarModulesOutput(modules, manifest, configuration != null ? configuration.getPluginXmlPath() : null); } - private static File jarModulesOutput(@NotNull Set modules, @Nullable Manifest manifest, final @Nullable String pluginXmlPath) throws IOException { - File jarFile = FileUtil.createTempFile(TEMP_PREFIX, JAR_EXTENSION); - jarFile.deleteOnExit(); - ZipOutputStream jarPlugin = null; - try { - BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(jarFile)); - jarPlugin = manifest != null ? new JarOutputStream(out, manifest) : new JarOutputStream(out); - final ProgressIndicator progressIndicator = ProgressManager.getInstance().getProgressIndicator(); - final Set writtenItemRelativePaths = new HashSet<>(); + private static File jarModulesOutput(Set modules, @Nullable Manifest manifest, @Nullable String pluginXmlPath) throws IOException { + File tempFile = FileUtil.createTempFile(TEMP_PREFIX, JAR_EXTENSION); + + try (Compressor.Jar jar = new Compressor.Jar(tempFile)) { + FileTypeManager manager = FileTypeManager.getInstance(); + Set uniqueEntries = new HashSet<>(); + jar.filter((entryName, isDir) -> isDir || !manager.isFileIgnored(PathUtil.getFileName(entryName)) && uniqueEntries.add(entryName)); + + if (manifest != null) { + jar.addManifest(manifest); + } + for (Module module : modules) { - final VirtualFile compilerOutputPath = CompilerModuleExtension.getInstance(module).getCompilerOutputPath(); - if (compilerOutputPath == null) continue; //pre-condition: output dirs for all modules are up-to-date - ZipUtil.addDirToZipRecursively(jarPlugin, jarFile, new File(compilerOutputPath.getPath()), "", - createFilter(progressIndicator, FileTypeManager.getInstance()), writtenItemRelativePaths); + CompilerModuleExtension extension = CompilerModuleExtension.getInstance(module); + if (extension != null) { + VirtualFile outputPath = extension.getCompilerOutputPath(); + if (outputPath != null) { + // pre-condition: output dirs for all modules are up-to-date + jar.addDirectory(new File(outputPath.getPath())); + } + } } + if (pluginXmlPath != null) { - ZipUtil.addFileToZip(jarPlugin, new File(pluginXmlPath), "/META-INF/plugin.xml", writtenItemRelativePaths, - createFilter(progressIndicator, null)); + jar.addFile("META-INF/plugin.xml", new File(pluginXmlPath)); } } - finally { - if (jarPlugin != null) jarPlugin.close(); - } - return jarFile; + + return tempFile; } public static Manifest createOrFindManifest(@Nullable PluginBuildConfiguration configuration) throws IOException {