/* * Copyright 2010-2015 Institut Pasteur. * * This file is part of Icy. * * Icy 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. * * Icy is 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 Icy. If not, see <http://www.gnu.org/licenses/>. */ package icy.network; import icy.util.StringUtil; import java.io.File; import java.net.MalformedURLException; import java.net.URL; /** * @author Stephane */ public class URLUtil { public static final String PROTOCOL_FILE = "file"; public static final String PROTOCOL_FTP = "ftp"; public static final String PROTOCOL_GOPHER = "gopher"; public static final String PROTOCOL_HTTP = "http"; public static final String PROTOCOL_JAR = "jar"; /** * Convert a network path to a URL */ public static URL getURL(String path) { if (path == null) return null; // first we try as network URL try { return new URL(path); } catch (MalformedURLException e) { // then we try to get it as file URL try { return new File(path).toURI().toURL(); } catch (MalformedURLException e2) { return null; } } } public static boolean isURL(String path) { return getURL(path) != null; } public static boolean isNetworkURL(String path) { return isNetworkURL(getURL(path)); } public static boolean isNetworkURL(URL url) { return (url != null) && !url.getProtocol().equals(PROTOCOL_FILE); } public static boolean isFileURL(String path) { return isFileURL(getURL(path)); } public static boolean isFileURL(URL url) { return (url != null) && url.getProtocol().equals(PROTOCOL_FILE); } /** * Returns <code>true</code> if the url defines an absolute address and <code>false</code> if it * defines a relative address. */ public static boolean isAbsolute(String path) { if (!StringUtil.isEmpty(path)) { int index = path.indexOf(':'); // protocol or drive letter if (index != -1) { if ((index + 1) < path.length()) return (path.charAt(index + 1) == '/'); return false; } return (path.charAt(0) == '/'); } return false; } public static String getNetworkURLString(String base, String path) { if (StringUtil.isEmpty(base)) return path; if (StringUtil.isEmpty(path)) return base; if (isNetworkURL(path)) return path; return base + path; } public static String getURLProtocol(URL url) { if (url == null) return null; return url.getProtocol(); } public static String getURLHost(URL url) { if (url == null) return null; return url.getHost(); } public static String getURLDirectory(String url) { return getURLDirectory(getURL(url)); } public static String getURLDirectory(URL url) { if (url != null) { final String path = url.getPath(); if (!StringUtil.isEmpty(path)) { int index = path.lastIndexOf('/'); if (index != -1) return path.substring(0, index + 1); index = path.lastIndexOf(':'); if (index != -1) return path.substring(0, index + 1); } } return ""; } public static String getURLFileName(String url) { return getURLFileName(getURL(url)); } public static String getURLFileName(String url, boolean withExtension) { return getURLFileName(getURL(url), withExtension); } public static String getURLFileName(URL url) { return getURLFileName(url, true); } public static String getURLFileName(URL url, boolean withExtension) { if (url == null) return ""; final String path = url.getPath(); if (StringUtil.isEmpty(path)) return ""; int index = path.lastIndexOf('/'); final String fileName; if (index != -1) fileName = path.substring(index + 1); else { index = path.lastIndexOf(':'); if (index != -1) fileName = path.substring(index + 1); else fileName = path; } if (withExtension) return fileName; index = fileName.lastIndexOf('.'); if (index == 0) return ""; else if (index != -1) return fileName.substring(0, index); else return fileName; } public static String getURLFileExtension(String url, boolean withDot) { return getURLFileExtension(getURL(url), withDot); } public static String getURLFileExtension(URL url, boolean withDot) { if (url == null) return ""; final String path = url.getPath(); if (StringUtil.isEmpty(path)) return ""; final int index = path.lastIndexOf('.'); if (index == -1) return ""; if (withDot) return path.substring(index); return path.substring(index + 1); } public static String getURLQuery(URL url) { if (url == null) return null; return url.getQuery(); } /** * Build a URL from a base path and specified url.<br> * If the url is a relative address then result is the concatenation of base path and url.<br> * If the specified url is an absolute address then the url is returned as it is. */ public static URL buildURL(String basePath, String url) { if (!isAbsolute(url) && !StringUtil.isEmpty(basePath)) return getURL(basePath + url); return getURL(url); } }