/* ======================================================================== * PlantUML : a free UML diagram generator * ======================================================================== * * (C) Copyright 2009-2023, Arnaud Roques * * Project Info: http://plantuml.com * * If you like this project or if you find it useful, you can support us at: * * http://plantuml.com/patreon (only 1$ per month!) * http://plantuml.com/paypal * * This file is part of PlantUML. * * PlantUML is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PlantUML distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * * Original Author: Arnaud Roques * * */ package net.sourceforge.plantuml.sprite; import static java.nio.charset.StandardCharsets.UTF_8; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLDecoder; import java.util.Collections; import java.util.Enumeration; import java.util.Set; import java.util.TreeSet; import java.util.jar.JarEntry; import java.util.jar.JarFile; import net.sourceforge.plantuml.log.Logger; import net.sourceforge.plantuml.security.SFile; import net.sourceforge.plantuml.version.Version; public class RessourcesUtils { public static Set getJarFile(String path, boolean folder) throws IOException { if (path.startsWith("/") || path.endsWith("/")) { throw new IllegalArgumentException(); } final String protocol = getProtocol(); if ("file".equals(protocol)) { final URL local = Version.class.getClassLoader().getResource(path); try { return listEntry(new SFile(local.toURI())); } catch (URISyntaxException e) { Logger.error(e); return null; } } if ("jar".equals(protocol)) { final String classFile = Version.class.getName().replace(".", "/") + ".class"; final URL versionURL = Version.class.getClassLoader().getResource(classFile); final String jarPath = versionURL.getPath().substring(5, versionURL.getPath().indexOf("!")); if (folder) { return listFolders(new JarFile(URLDecoder.decode(jarPath, UTF_8.name())), path + "/"); } else { return listFiles(new JarFile(URLDecoder.decode(jarPath, UTF_8.name())), path + "/"); } } return Collections.emptySet(); } private static String getProtocol() { final URL resource = Version.class.getClassLoader().getResource("net/sourceforge/plantuml/version/logo.png"); return resource.getProtocol(); } private static Set listFiles(JarFile jarFile, String path) { final Enumeration entries = jarFile.entries(); final Set result = new TreeSet<>(); while (entries.hasMoreElements()) { final String name = entries.nextElement().getName(); if (name.startsWith(path)) { result.add(name.substring(path.length())); } } return result; } private static Set listFolders(JarFile jarFile, String path) { final Enumeration entries = jarFile.entries(); final Set result = new TreeSet<>(); while (entries.hasMoreElements()) { final String name = entries.nextElement().getName(); if (name.startsWith(path)) { final String folder = name.substring(path.length()); final int x = folder.indexOf('/'); if (x != -1) { result.add(folder.substring(0, x)); } } } return result; } private static Set listEntry(SFile dir) { final Set result = new TreeSet<>(); for (String n : dir.list()) { result.add(n); } return result; } }