347130 Empty getResourcePaths due to ZipFileClosedException
This commit is contained in:
parent
c7c4c6e13b
commit
4d889de159
|
@ -19,6 +19,7 @@ import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
|
import java.util.List;
|
||||||
import java.util.jar.JarEntry;
|
import java.util.jar.JarEntry;
|
||||||
import java.util.jar.JarFile;
|
import java.util.jar.JarFile;
|
||||||
|
|
||||||
|
@ -108,7 +109,7 @@ class JarFileResource extends JarResource
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
/**
|
/**
|
||||||
* Returns true if the respresenetd resource exists.
|
* Returns true if the represented resource exists.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean exists()
|
public boolean exists()
|
||||||
|
@ -240,67 +241,100 @@ class JarFileResource extends JarResource
|
||||||
@Override
|
@Override
|
||||||
public synchronized String[] list()
|
public synchronized String[] list()
|
||||||
{
|
{
|
||||||
|
if (isDirectory() && _list==null)
|
||||||
if(isDirectory() && _list==null)
|
|
||||||
{
|
{
|
||||||
ArrayList list = new ArrayList(32);
|
List<String> list = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
list = listEntries();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
//Sun's JarURLConnection impl for jar: protocol will close a JarFile in its connect() method if
|
||||||
|
//useCaches == false (eg someone called URLConnection with defaultUseCaches==true).
|
||||||
|
//As their sun.net.www.protocol.jar package caches JarFiles and/or connections, we can wind up in
|
||||||
|
//the situation where the JarFile we have remembered in our _jarFile member has actually been closed
|
||||||
|
//by other code.
|
||||||
|
//So, do one retry to drop a connection and get a fresh JarFile
|
||||||
|
LOG.warn("Retrying list:"+e);
|
||||||
|
LOG.debug(e);
|
||||||
|
release();
|
||||||
|
list = listEntries();
|
||||||
|
}
|
||||||
|
|
||||||
checkConnection();
|
if (list != null)
|
||||||
|
|
||||||
JarFile jarFile=_jarFile;
|
|
||||||
if(jarFile==null)
|
|
||||||
{
|
{
|
||||||
try
|
_list=new String[list.size()];
|
||||||
{
|
list.toArray(_list);
|
||||||
JarURLConnection jc=(JarURLConnection)((new URL(_jarUrl)).openConnection());
|
}
|
||||||
jc.setUseCaches(getUseCaches());
|
|
||||||
jarFile=jc.getJarFile();
|
|
||||||
}
|
|
||||||
catch(Exception e)
|
|
||||||
{
|
|
||||||
LOG.ignore(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Enumeration e=jarFile.entries();
|
|
||||||
String dir=_urlString.substring(_urlString.indexOf("!/")+2);
|
|
||||||
while(e.hasMoreElements())
|
|
||||||
{
|
|
||||||
|
|
||||||
JarEntry entry = (JarEntry) e.nextElement();
|
|
||||||
String name=entry.getName().replace('\\','/');
|
|
||||||
if(!name.startsWith(dir) || name.length()==dir.length())
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
String listName=name.substring(dir.length());
|
|
||||||
int dash=listName.indexOf('/');
|
|
||||||
if (dash>=0)
|
|
||||||
{
|
|
||||||
//when listing jar:file urls, you get back one
|
|
||||||
//entry for the dir itself, which we ignore
|
|
||||||
if (dash==0 && listName.length()==1)
|
|
||||||
continue;
|
|
||||||
//when listing jar:file urls, all files and
|
|
||||||
//subdirs have a leading /, which we remove
|
|
||||||
if (dash==0)
|
|
||||||
listName=listName.substring(dash+1, listName.length());
|
|
||||||
else
|
|
||||||
listName=listName.substring(0,dash+1);
|
|
||||||
|
|
||||||
if (list.contains(listName))
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
list.add(listName);
|
|
||||||
}
|
|
||||||
|
|
||||||
_list=new String[list.size()];
|
|
||||||
list.toArray(_list);
|
|
||||||
}
|
}
|
||||||
return _list;
|
return _list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
private List<String> listEntries ()
|
||||||
|
{
|
||||||
|
checkConnection();
|
||||||
|
|
||||||
|
ArrayList<String> list = new ArrayList<String>(32);
|
||||||
|
JarFile jarFile=_jarFile;
|
||||||
|
if(jarFile==null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
JarURLConnection jc=(JarURLConnection)((new URL(_jarUrl)).openConnection());
|
||||||
|
jc.setUseCaches(getUseCaches());
|
||||||
|
jarFile=jc.getJarFile();
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
|
||||||
|
e.printStackTrace();
|
||||||
|
LOG.ignore(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Enumeration e=jarFile.entries();
|
||||||
|
String dir=_urlString.substring(_urlString.indexOf("!/")+2);
|
||||||
|
while(e.hasMoreElements())
|
||||||
|
{
|
||||||
|
|
||||||
|
JarEntry entry = (JarEntry) e.nextElement();
|
||||||
|
String name=entry.getName().replace('\\','/');
|
||||||
|
if(!name.startsWith(dir) || name.length()==dir.length())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String listName=name.substring(dir.length());
|
||||||
|
int dash=listName.indexOf('/');
|
||||||
|
if (dash>=0)
|
||||||
|
{
|
||||||
|
//when listing jar:file urls, you get back one
|
||||||
|
//entry for the dir itself, which we ignore
|
||||||
|
if (dash==0 && listName.length()==1)
|
||||||
|
continue;
|
||||||
|
//when listing jar:file urls, all files and
|
||||||
|
//subdirs have a leading /, which we remove
|
||||||
|
if (dash==0)
|
||||||
|
listName=listName.substring(dash+1, listName.length());
|
||||||
|
else
|
||||||
|
listName=listName.substring(0,dash+1);
|
||||||
|
|
||||||
|
if (list.contains(listName))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
list.add(listName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
/**
|
/**
|
||||||
* Return the length of the resource
|
* Return the length of the resource
|
||||||
|
|
Loading…
Reference in New Issue