From 7584d3ae1ff125f9baac1d0d10d2edf486967661 Mon Sep 17 00:00:00 2001 From: Andrew Mu Date: Sun, 19 Aug 2018 18:17:59 -0700 Subject: [PATCH] Extract dylib for Mac, Remove Zip Requirement --- BWAPI4J/build.gradle | 8 +-- .../src/main/java/org/openbw/bwapi4j/BW.java | 65 +++++++------------ 2 files changed, 27 insertions(+), 46 deletions(-) diff --git a/BWAPI4J/build.gradle b/BWAPI4J/build.gradle index db2491e4..1a0e683e 100644 --- a/BWAPI4J/build.gradle +++ b/BWAPI4J/build.gradle @@ -2,8 +2,6 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent import java.nio.charset.StandardCharsets -import java.nio.file.Files -import java.nio.file.Paths group 'org.openbw.bwapi4j' version '0.8.2b' @@ -36,7 +34,6 @@ dependencies { compile 'org.apache.logging.log4j:log4j-core:2.11.0' compile 'org.apache.commons:commons-lang3:3.7' compile 'com.github.xaguzman:pathfinding:0.2.6' - compile 'net.lingala.zip4j:zip4j:1.3.2' testCompile 'junit:junit:4.12' testCompile 'org.apache.commons:commons-compress:1.16.1' @@ -45,10 +42,10 @@ dependencies { shadowJar { relocate 'org.apache.commons', 'org.openbw.bwapi4j.org.apache.commons' relocate 'org.xguzm', 'org.openbw.bwapi4j.org.xguzm' - relocate 'net.lingala.zip4j', 'org.openbw.bwapi4j.net.lingala.zip4j' classifier = null from ('../BWAPI4JBridge/Release') { include '*.dll' + include '*.dylib' include '*.so' } } @@ -124,8 +121,7 @@ task generateJniHeaders(type:Exec) { "org.openbw.bwapi4j.InteractionHandler", "org.openbw.bwapi4j.MapDrawer", "org.openbw.bwapi4j.DamageEvaluator", - "org.openbw.bwapi4j.unit.UnitImpl", - "net.lingala.zip4j.core.ZipFile" //javah complains if this is not specified + "org.openbw.bwapi4j.unit.UnitImpl" dependsOn classes } diff --git a/BWAPI4J/src/main/java/org/openbw/bwapi4j/BW.java b/BWAPI4J/src/main/java/org/openbw/bwapi4j/BW.java index aa808926..1296d2e3 100644 --- a/BWAPI4J/src/main/java/org/openbw/bwapi4j/BW.java +++ b/BWAPI4J/src/main/java/org/openbw/bwapi4j/BW.java @@ -21,6 +21,9 @@ package org.openbw.bwapi4j; import java.awt.image.ColorModel; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -28,20 +31,17 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.stream.Collectors; -import net.lingala.zip4j.core.ZipFile; -import net.lingala.zip4j.exception.ZipException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.openbw.bwapi4j.type.UnitType; @@ -223,14 +223,11 @@ private void extractBridgeDependencies(final BridgeType bridgeType) { && jarFile.toString().endsWith(".jar")) { logger.debug("Extracting dependencies from: " + jarFile.toString()); - final ZipFile jar = new ZipFile(jarFile.toFile()); - extractFileIfNotExists( - jar, resolvePlatformLibraryFilename(bridgeType.getLibraryName()), cwd.toString()); - + resolvePlatformLibraryFilename(bridgeType.getLibraryName()), cwd.toString()); for (final String externalLibrary : getExternalLibraryNames()) { extractFileIfNotExists( - jar, resolvePlatformLibraryFilename(externalLibrary), cwd.toString()); + resolvePlatformLibraryFilename(externalLibrary), cwd.toString()); } } } catch (final Exception e) { @@ -240,14 +237,16 @@ private void extractBridgeDependencies(final BridgeType bridgeType) { } } - private static void extractFileIfNotExists( - final ZipFile zipFile, final String sourceFilename, final String targetDirectory) - throws ZipException { - final Path targetFile = Paths.get(targetDirectory, sourceFilename); - if (!Files.isRegularFile(targetFile) - && !Files.isDirectory(targetFile) - && !Files.exists(targetFile)) { - zipFile.extractFile(sourceFilename, targetDirectory); + private static void extractFileIfNotExists(final String sourceFilename, final String targetDirectory) { + final File library = new File(targetDirectory, sourceFilename); + if (!library.exists()) { + InputStream is = BW.class.getResourceAsStream(File.separator + sourceFilename); + try { + Files.copy(is, library.toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + //noinspection ResultOfMethodCallIgnored + library.delete(); + } } } @@ -331,11 +330,6 @@ private List getExternalLibraryNames() { return libNames; } - - private static String getLibraryPathDelimiter() { - return isWindowsPlatform() ? ";" : ":"; - } - private static boolean isWindowsPlatform() { return System.getProperty("os.name").contains("Windows"); } @@ -394,7 +388,7 @@ private void addLibraryPath(final String path) { logger.info("Adding library path: {}", path); - final String libraryPathDelimiter = getLibraryPathDelimiter(); + final String libraryPathDelimiter = File.pathSeparator; final String newLibraryPath = currentLibraryPath + (!currentLibraryPath.endsWith(libraryPathDelimiter) ? libraryPathDelimiter : "") @@ -433,27 +427,18 @@ private static boolean systemPropertyEquals( } private static String resolvePlatformLibraryFilename(String libraryName) { - if (isWindowsPlatform()) { - if (!libraryName.toLowerCase(Locale.US).endsWith(".dll")) { - libraryName += ".dll"; - } - } else { - if (!libraryName.startsWith("lib")) { - libraryName = "lib" + libraryName; - } - - if (!libraryName.toLowerCase(Locale.US).endsWith(".so")) { - libraryName += ".so"; - } + switch (OSType.computeType()) { + case WINDOWS: + return libraryName + ".dll"; + case MAC: + return "lib" + libraryName + ".dylib"; + default: + return "lib" + libraryName + ".so"; } - - return libraryName; } private static boolean isPathFoundInPathVariable(final String pathVariable, final String path) { - final String delim = isWindowsPlatform() ? ";" : ":"; - - final String[] paths = pathVariable.split(delim); + final String[] paths = pathVariable.split(File.pathSeparator); for (final String directory : paths) { final Path targetDirectory;