package org.nutz.resource.impl;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.regex.Pattern;
import org.nutz.resource.NutResource;
public class JarResourceLocation extends ResourceLocation {
protected List<String> names = new ArrayList<String>();
protected URI uri;
public String id() {
return uri.toString();
}
public void scan(String base, Pattern regex, List<NutResource> list) {
for (final String ensName : names) {
if (!ensName.startsWith(base))
continue;
String name = ensName;
if (name.contains("/"))
name = name.substring(name.lastIndexOf('/') + 1);
if (null == regex || regex.matcher(name).find()) {
NutResource nutResource = new NutResource() {
public InputStream getInputStream() throws IOException {
return new URL(uriJarPrefix(uri,"!/" + ensName)).openStream();
}
public int hashCode() {
return (id() + ":" + ensName).hashCode();
}
public String toString() {
return uriJarPrefix(uri, "!/" + ensName);
}
};
if (ensName.equals(base))
nutResource.setName(ensName);
else
nutResource.setName(ensName.substring(base.length()));
nutResource.setSource(id() + ":" + ensName);
nutResource.setPriority(75);
list.add(nutResource);
}
}
}
public String toString() {
return id();
}
public JarResourceLocation(URL url) throws IOException {
JarURLConnection jarConn = null;
JarFile jf = null;
try {
this.uri = url.toURI();
jarConn = (JarURLConnection) new URL(uriJarPrefix(url.toURI(), "!/")).openConnection();
jf = jarConn.getJarFile();
Enumeration<JarEntry> ens = jf.entries();
while (ens.hasMoreElements()) {
JarEntry en = ens.nextElement();
names.add(en.getName());
}
}
catch (Throwable e) {
e.printStackTrace();
}
finally {
if (jf != null)
try {
jf.close();
} catch (Throwable e) {
}
}
}
public JarResourceLocation(String jarPath) throws IOException {
this(new File(jarPath).toURI().toURL());
}
private String uriJarPrefix(URI uri, String suffix) {
String uriString = uri.toString();
if (uriString.startsWith("jar:")) {
return uriString + suffix;
} else {
return "jar:" + uriString + suffix;
}
}
}