package org.objectstyle.wolips.baseforplugins.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class URLUtils {
public static String getExtension(URL url) {
return URLUtils.getExtension(url.getPath());
}
public static String getExtension(URI uri) {
return URLUtils.getExtension(uri.getPath());
}
public static String getExtension(String path) {
String extension = null;
if (path != null) {
int dotIndex = path.lastIndexOf('.');
if (dotIndex != -1) {
extension = path.substring(dotIndex + 1);
}
}
return extension;
}
public static String getName(URL url) {
return URLUtils.getName(url.getPath());
}
public static String getName(URI uri) {
return URLUtils.getName(uri.getPath());
}
public static String getName(String path) {
String name = null;
if (path != null) {
int slashIndex = path.lastIndexOf('/');
if (slashIndex != -1) {
name = path.substring(slashIndex + 1);
}
else {
name = path;
}
}
return name;
}
public static boolean isFolder(URL url) throws IOException {
boolean isFolder = false;
String protocol = url.getProtocol();
if ("file".equals(protocol)) {
File f = new File(url.getPath());
isFolder = f.isDirectory();
} else if ("jar".equals(protocol)) {
JarURLConnection conn = (JarURLConnection) url.openConnection();
isFolder = conn.getJarEntry().isDirectory();
} else {
throw new IllegalArgumentException(url + " is not a File.");
}
return isFolder;
}
/**
* @param url - the url for the file or bundle resource
* @return true when the protocol is either <code>bundleresource</code> or <code>file</code> and the file exists.
*/
public static boolean isFileOrBundleResource(URL url) {
String protocol = url.getProtocol();
if ("bundleresource".equals(protocol) || "file".equals(protocol))
return exists(url);
return false;
}
public static boolean isJarURL(URL url) {
return "jar".equals(url.getProtocol());
}
public static URL[] getChildrenFolders(URL url) throws IOException {
URL parentUrl = url;
URL[] children;
String protocol = parentUrl.getProtocol();
if ("bundleresource".equals(protocol)) {
URLConnection conn = parentUrl.openConnection();
parentUrl = conn.getURL();
protocol = parentUrl.getProtocol();
}
if ("file".equals(protocol)) {
File f = new File(parentUrl.getPath()).getAbsoluteFile();
if (!f.exists()) {
children = new URL[0];
}
else {
File[] files = f.listFiles();
if (files == null) {
children = new URL[0];
}
else {
List<URL> childrenList = new LinkedList<URL>();
for (int i = 0; i < files.length; i++) {
File child = files[i];
if (!child.isHidden() && child.isDirectory()) {
childrenList.add(child.toURI().toURL());
}
}
children = childrenList.toArray(new URL[childrenList.size()]);
}
}
} else if ("jar".equals(protocol)) {
List<URL> childEntries = new LinkedList<URL>();
JarURLConnection conn = (JarURLConnection) parentUrl.openConnection();
JarFile jarFile = null;
try {
jarFile = conn.getJarFile();
JarEntry folderJarEntry = conn.getJarEntry();
String folderName = folderJarEntry.getName();
Enumeration<JarEntry> jarEntriesEnum = jarFile.entries();
while (jarEntriesEnum.hasMoreElements()) {
JarEntry jarEntry = jarEntriesEnum.nextElement();
String name = jarEntry.getName();
if (name.startsWith(folderName)) {
URL childURL = new URL(parentUrl, name);
childEntries.add(childURL);
}
}
children = childEntries.toArray(new URL[childEntries.size()]);
} catch (Exception e) {
children = new URL[0];
}
} else {
throw new IllegalArgumentException(parentUrl + " is not a format that can have its children retrieved.");
}
return children;
}
public static File cheatAndTurnIntoFile(URI uri) {
try {
return cheatAndTurnIntoFile(uri.toURL());
} catch (MalformedURLException e) {
throw new IllegalArgumentException("Unable to turn '" + uri + "' into a URL.", e);
}
}
public static File cheatAndTurnIntoFile(URL url) {
File f;
if (url == null) {
f = null;
}
else {
String protocol = url.getProtocol();
if ("jar".equals(protocol)) {
String externalForm = url.toExternalForm();
int colonIndex = externalForm.indexOf(':');
int bangIndex = externalForm.indexOf('!');
String jarPath;
if (bangIndex == -1) {
jarPath = externalForm.substring(colonIndex + 1);
}
else {
jarPath = externalForm.substring(colonIndex + 1, bangIndex);
}
try {
f = new File(new URI(jarPath));
}
catch (Exception e) {
throw new IllegalArgumentException(url + " cannot be turned into a File.", e);
}
}
else if ("file".equals(protocol)) {
try {
String externalForm = url.getPath();
f = new File(externalForm);
if (!f.exists()) {
externalForm = URLDecoder.decode(externalForm, "UTF-8");
f = new File(externalForm);
}
} catch (IOException e) {
throw new IllegalArgumentException(url + " cannot be turned into a File.", e);
}
} else if ("bundleresource".equals(protocol)) {
try {
URLConnection conn = url.openConnection();
String externalForm = conn.getURL().toExternalForm();
externalForm = URLDecoder.decode(externalForm, "UTF-8");
externalForm = externalForm.replaceAll(" ", "%20");
f = new File(new URI(externalForm));
} catch (IOException e) {
throw new IllegalArgumentException(url + " cannot be turned into a File.", e);
} catch (URISyntaxException e) {
throw new IllegalArgumentException(url + " cannot be turned into a File.", e);
}
} else {
throw new IllegalArgumentException(url + " is not a File.");
}
}
return f;
}
public static boolean exists(URL url) {
boolean exists = false;
String protocol = url.getProtocol();
if ("jar".equals(protocol)) {
try {
JarURLConnection conn = (JarURLConnection) url.openConnection();
conn.getJarEntry();
exists = true;
} catch (FileNotFoundException e) {
exists = false;
} catch (IOException e) {
// MS: Ah yes ... I remember now. It's chatty as all hell, that's why i commented this out. It just
// happens constantly for no particularly good reason. Another victory for crappy core libraries in
// java!
//e.printStackTrace();
//throw new IllegalArgumentException(url + " is not a File.");
}
} else if ("file".equals(protocol) || "bundleresource".equals(protocol)) {
File file = cheatAndTurnIntoFile(url);
if (file != null) {
exists = file.exists();
}
} else {
throw new IllegalArgumentException(url + " is not a File.");
}
return exists;
}
}