package games.strategy.triplea; import java.net.URL; import java.util.Arrays; /** * Utility class containing the logic for whether or not to create a special resource loading path prefix. */ class ResourceLocationTracker { /** * master zip is the zipped folder format you get when downloading from a map repo via the 'clone or download' button. */ static final String MASTER_ZIP_MAGIC_PREFIX = "-master/map/"; static final String MASTER_ZIP_IDENTIFYING_SUFFIX = "-master.zip"; private final String mapPrefix; /** * * @param mapName Used to construct any special resource loading path prefixes, used as needed depending upon which * resources are in the path * @param resourcePaths The list of paths used for a map as resources. From this we can determine if the map is being * loaded from a zip or a directory, and if zip, if it matches any particular naming. */ ResourceLocationTracker(String mapName, URL[] resourcePaths) { boolean isUsingMasterZip = Arrays.asList(resourcePaths) .stream().filter(path -> path.toString().endsWith(MASTER_ZIP_IDENTIFYING_SUFFIX)).findAny().isPresent(); // map skins will have the full path name as their map name. if (mapName.endsWith("-master.zip")) { mapPrefix = mapName.substring(0, mapName.length() - "-master.zip".length()) + MASTER_ZIP_MAGIC_PREFIX; } else { mapPrefix = isUsingMasterZip ? mapName + MASTER_ZIP_MAGIC_PREFIX : ""; } } /** * Will return an empty string unless a special prefix is needed, in which case that prefix is constructed * based on the map name. * * <p> * The 'mapPrefix' is the path within a map zip file where we will then find any map contents. * For example, if the map prefix is "map", then when we expand the map zip, we would expect * "/map" to be the first folder we see, and we woudl expect things like "/map/game" and * "/map/polygons.txt" to exist. * </p> */ String getMapPrefix() { return mapPrefix; } }