Merge branch 'master' into javawebsocket-jsr

This commit is contained in:
Joakim Erdfelt 2013-06-03 09:06:38 -07:00
commit 020dd1022c
27 changed files with 505 additions and 337 deletions

View File

@ -540,9 +540,8 @@ public class AntWebAppContext extends WebAppContext
if (getDescriptor() != null)
{
try
try (Resource r = Resource.newResource(getDescriptor());)
{
Resource r = Resource.newResource(getDescriptor());
scanList.add(r.getFile());
}
catch (IOException e)
@ -553,9 +552,8 @@ public class AntWebAppContext extends WebAppContext
if (getJettyEnvXml() != null)
{
try
try (Resource r = Resource.newResource(getJettyEnvXml());)
{
Resource r = Resource.newResource(getJettyEnvXml());
scanList.add(r.getFile());
}
catch (IOException e)
@ -566,11 +564,10 @@ public class AntWebAppContext extends WebAppContext
if (getDefaultsDescriptor() != null)
{
try
try (Resource r = Resource.newResource(getDefaultsDescriptor());)
{
if (!AntWebAppContext.WEB_DEFAULTS_XML.equals(getDefaultsDescriptor()))
{
Resource r = Resource.newResource(getDefaultsDescriptor());
if (!WebAppContext.WEB_DEFAULTS_XML.equals(getDefaultsDescriptor()))
{
scanList.add(r.getFile());
}
}

View File

@ -171,7 +171,7 @@ public interface HttpContent
@Override
public void release()
{
_resource.release();
_resource.close();
}
}
}

View File

@ -449,12 +449,28 @@ public abstract class AbstractJettyMojo extends AbstractMojo
{
if (getJettyXmlFiles() == null)
return;
XmlConfiguration last = null;
for ( File xmlFile : getJettyXmlFiles() )
{
getLog().info( "Configuring Jetty from xml configuration file = " + xmlFile.getCanonicalPath() );
XmlConfiguration xmlConfiguration = new XmlConfiguration(Resource.toURL(xmlFile));
xmlConfiguration.configure(this.server);
//chain ids from one config file to another
if (last == null)
xmlConfiguration.getIdMap().put("Server", this.server);
else
xmlConfiguration.getIdMap().putAll(last.getIdMap());
//Set the system properties each time in case the config file set a new one
Enumeration<?> ensysprop = System.getProperties().propertyNames();
while (ensysprop.hasMoreElements())
{
String name = (String)ensysprop.nextElement();
xmlConfiguration.getProperties().put(name,System.getProperty(name));
}
last = xmlConfiguration;
xmlConfiguration.configure();
}
}

View File

@ -405,9 +405,8 @@ public class JettyRunMojo extends AbstractJettyMojo
scanList = new ArrayList<File>();
if (webApp.getDescriptor() != null)
{
try
try (Resource r = Resource.newResource(webApp.getDescriptor());)
{
Resource r = Resource.newResource(webApp.getDescriptor());
scanList.add(r.getFile());
}
catch (IOException e)
@ -418,9 +417,8 @@ public class JettyRunMojo extends AbstractJettyMojo
if (webApp.getJettyEnvXml() != null)
{
try
try (Resource r = Resource.newResource(webApp.getJettyEnvXml());)
{
Resource r = Resource.newResource(webApp.getJettyEnvXml());
scanList.add(r.getFile());
}
catch (IOException e)
@ -431,13 +429,10 @@ public class JettyRunMojo extends AbstractJettyMojo
if (webApp.getDefaultsDescriptor() != null)
{
try
try (Resource r = Resource.newResource(webApp.getDefaultsDescriptor());)
{
if (!WebAppContext.WEB_DEFAULTS_XML.equals(webApp.getDefaultsDescriptor()))
{
Resource r = Resource.newResource(webApp.getDefaultsDescriptor());
scanList.add(r.getFile());
}
}
catch (IOException e)
{
@ -447,9 +442,8 @@ public class JettyRunMojo extends AbstractJettyMojo
if (webApp.getOverrideDescriptor() != null)
{
try
try (Resource r = Resource.newResource(webApp.getOverrideDescriptor());)
{
Resource r = Resource.newResource(webApp.getOverrideDescriptor());
scanList.add(r.getFile());
}
catch (IOException e)

View File

@ -169,7 +169,7 @@ public abstract class AbstractContextProvider extends AbstractLifeCycle implemen
jettyHome = jettyHome.substring(0,jettyHome.length()-1);
res = getFileAsResource(jettyHome, _contextFile);
if (LOG.isDebugEnabled()) LOG.debug("jetty home context file:"+res);
LOG.debug("jetty home context file: {}",res);
}
}
}
@ -179,8 +179,11 @@ public abstract class AbstractContextProvider extends AbstractLifeCycle implemen
{
if (bundleOverrideLocation != null)
{
res = getFileAsResource(Resource.newResource(bundleOverrideLocation).getFile(), _contextFile);
if (LOG.isDebugEnabled()) LOG.debug("Bundle override location context file:"+res);
try(Resource location=Resource.newResource(bundleOverrideLocation))
{
res=location.addPath(_contextFile);
}
LOG.debug("Bundle override location context file: {}",res);
}
}
@ -295,22 +298,6 @@ public abstract class AbstractContextProvider extends AbstractLifeCycle implemen
}
return r;
}
private Resource getFileAsResource (File dir, String file)
{
Resource r = null;
try
{
File asFile = new File (dir, file);
if (asFile.exists())
r = Resource.newResource(asFile);
}
catch (Exception e)
{
r = null;
}
return r;
}
}
/* ------------------------------------------------------------ */

View File

@ -118,17 +118,18 @@ public class Runner
if (".".equals(path) || "..".equals(path))
continue;
Resource item = lib.addPath(path);
if (item.isDirectory())
addJars(item);
else
try(Resource item = lib.addPath(path);)
{
if (path.toLowerCase().endsWith(".jar") ||
path.toLowerCase().endsWith(".zip"))
if (item.isDirectory())
addJars(item);
else
{
URL url = item.getURL();
_classpath.add(url);
if (path.toLowerCase().endsWith(".jar") ||
path.toLowerCase().endsWith(".zip"))
{
URL url = item.getURL();
_classpath.add(url);
}
}
}
}
@ -214,24 +215,30 @@ public class Runner
{
if ("--lib".equals(args[i]))
{
Resource lib = Resource.newResource(args[++i]);
if (!lib.exists() || !lib.isDirectory())
usage("No such lib directory "+lib);
_classpath.addJars(lib);
try(Resource lib = Resource.newResource(args[++i]);)
{
if (!lib.exists() || !lib.isDirectory())
usage("No such lib directory "+lib);
_classpath.addJars(lib);
}
}
else if ("--jar".equals(args[i]))
{
Resource jar = Resource.newResource(args[++i]);
if (!jar.exists() || jar.isDirectory())
usage("No such jar "+jar);
_classpath.addPath(jar);
try(Resource jar = Resource.newResource(args[++i]);)
{
if (!jar.exists() || jar.isDirectory())
usage("No such jar "+jar);
_classpath.addPath(jar);
}
}
else if ("--classes".equals(args[i]))
{
Resource classes = Resource.newResource(args[++i]);
if (!classes.exists() || !classes.isDirectory())
usage("No such classes directory "+classes);
_classpath.addPath(classes);
try(Resource classes = Resource.newResource(args[++i]);)
{
if (!classes.exists() || !classes.isDirectory())
usage("No such classes directory "+classes);
_classpath.addPath(classes);
}
}
else if (args[i].startsWith("--"))
i++;
@ -315,8 +322,11 @@ public class Runner
{
for (String cfg:_configFiles)
{
XmlConfiguration xmlConfiguration = new XmlConfiguration(Resource.newResource(cfg).getURL());
xmlConfiguration.configure(_server);
try (Resource resource=Resource.newResource(cfg))
{
XmlConfiguration xmlConfiguration = new XmlConfiguration(resource.getURL());
xmlConfiguration.configure(_server);
}
}
}
@ -416,34 +426,35 @@ public class Runner
}
// Create a context
Resource ctx = Resource.newResource(args[i]);
if (!ctx.exists())
usage("Context '"+ctx+"' does not exist");
if (contextPathSet && !(contextPath.startsWith("/")))
contextPath = "/"+contextPath;
try(Resource ctx = Resource.newResource(args[i]);)
{
if (!ctx.exists())
usage("Context '"+ctx+"' does not exist");
// Configure the context
if (!ctx.isDirectory() && ctx.toString().toLowerCase().endsWith(".xml"))
{
// It is a context config file
XmlConfiguration xmlConfiguration=new XmlConfiguration(ctx.getURL());
xmlConfiguration.getIdMap().put("Server",_server);
ContextHandler handler=(ContextHandler)xmlConfiguration.configure();
if (contextPathSet)
handler.setContextPath(contextPath);
_contexts.addHandler(handler);
handler.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", __containerIncludeJarPattern);
if (contextPathSet && !(contextPath.startsWith("/")))
contextPath = "/"+contextPath;
// Configure the context
if (!ctx.isDirectory() && ctx.toString().toLowerCase().endsWith(".xml"))
{
// It is a context config file
XmlConfiguration xmlConfiguration=new XmlConfiguration(ctx.getURL());
xmlConfiguration.getIdMap().put("Server",_server);
ContextHandler handler=(ContextHandler)xmlConfiguration.configure();
if (contextPathSet)
handler.setContextPath(contextPath);
_contexts.addHandler(handler);
handler.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", __containerIncludeJarPattern);
}
else
{
// assume it is a WAR file
WebAppContext webapp = new WebAppContext(_contexts,ctx.toString(),contextPath);
webapp.setConfigurationClasses(__plusConfigurationClasses);
webapp.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
__containerIncludeJarPattern);
}
}
else
{
// assume it is a WAR file
WebAppContext webapp = new WebAppContext(_contexts,ctx.toString(),contextPath);
webapp.setConfigurationClasses(__plusConfigurationClasses);
webapp.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
__containerIncludeJarPattern);
}
//reset
contextPathSet = false;
contextPath = __defaultContextPath;

View File

@ -444,7 +444,7 @@ public class ResourceCache
// Invalidate it
_cachedSize.addAndGet(-_length);
_cachedFiles.decrementAndGet();
_resource.release();
_resource.close();
}
/* ------------------------------------------------------------ */

View File

@ -567,7 +567,7 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory
if (content!=null)
content.release();
else if (resource!=null)
resource.release();
resource.close();
}
}
@ -658,7 +658,7 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory
if (ifm!=null)
{
boolean match=false;
if (content!=null && content.getETag()!=null)
if (content.getETag()!=null)
{
QuotedStringTokenizer quoted = new QuotedStringTokenizer(ifm,", ",false,true);
while (!match && quoted.hasMoreTokens())
@ -671,48 +671,39 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory
if (!match)
{
Response r = Response.getResponse(response);
r.reset(true);
r.setStatus(HttpServletResponse.SC_PRECONDITION_FAILED);
response.setStatus(HttpServletResponse.SC_PRECONDITION_FAILED);
return false;
}
}
String ifnm=request.getHeader(HttpHeader.IF_NONE_MATCH.asString());
if (ifnm!=null && content!=null && content.getETag()!=null)
String if_non_match_etag=request.getHeader(HttpHeader.IF_NONE_MATCH.asString());
if (if_non_match_etag!=null && content.getETag()!=null)
{
// Look for GzipFiltered version of etag
if (content.getETag().toString().equals(request.getAttribute("o.e.j.s.GzipFilter.ETag")))
{
Response r = Response.getResponse(response);
r.reset(true);
r.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
r.getHttpFields().put(HttpHeader.ETAG,ifnm);
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
response.setHeader(HttpHeader.ETAG.asString(),if_non_match_etag);
return false;
}
// Handle special case of exact match.
if (content.getETag().toString().equals(ifnm))
if (content.getETag().toString().equals(if_non_match_etag))
{
Response r = Response.getResponse(response);
r.reset(true);
r.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
r.getHttpFields().put(HttpHeader.ETAG,content.getETag());
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
response.setHeader(HttpHeader.ETAG.asString(),content.getETag());
return false;
}
// Handle list of tags
QuotedStringTokenizer quoted = new QuotedStringTokenizer(ifnm,", ",false,true);
QuotedStringTokenizer quoted = new QuotedStringTokenizer(if_non_match_etag,", ",false,true);
while (quoted.hasMoreTokens())
{
String tag = quoted.nextToken();
if (content.getETag().toString().equals(tag))
{
Response r = Response.getResponse(response);
r.reset(true);
r.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
r.getHttpFields().put(HttpHeader.ETAG,content.getETag());
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
response.setHeader(HttpHeader.ETAG.asString(),content.getETag());
return false;
}
}
@ -727,50 +718,33 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory
if (ifms!=null)
{
//Get jetty's Response impl
Response r = Response.getResponse(response);
if (content!=null)
String mdlm=content.getLastModified();
if (mdlm!=null && ifms.equals(mdlm))
{
String mdlm=content.getLastModified();
if (mdlm!=null)
{
if (ifms.equals(mdlm))
{
r.reset(true);
r.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
if (_etags)
r.getHttpFields().add(HttpHeader.ETAG,content.getETag());
r.flushBuffer();
return false;
}
}
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
if (_etags)
response.setHeader(HttpHeader.ETAG.asString(),content.getETag());
response.flushBuffer();
return false;
}
long ifmsl=request.getDateHeader(HttpHeader.IF_MODIFIED_SINCE.asString());
if (ifmsl!=-1)
{
if (resource.lastModified()/1000 <= ifmsl/1000)
{
r.reset(true);
r.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
if (_etags)
r.getHttpFields().add(HttpHeader.ETAG,content.getETag());
r.flushBuffer();
return false;
}
if (ifmsl!=-1 && resource.lastModified()/1000 <= ifmsl/1000)
{
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
if (_etags)
response.setHeader(HttpHeader.ETAG.asString(),content.getETag());
response.flushBuffer();
return false;
}
}
// Parse the if[un]modified dates and compare to resource
long date=request.getDateHeader(HttpHeader.IF_UNMODIFIED_SINCE.asString());
if (date!=-1)
if (date!=-1 && resource.lastModified()/1000 > date/1000)
{
if (resource.lastModified()/1000 > date/1000)
{
response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED);
return false;
}
response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED);
return false;
}
}

View File

@ -26,7 +26,6 @@ import java.io.RandomAccessFile;
import java.nio.Buffer;
import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.nio.charset.Charset;
@ -372,12 +371,14 @@ public class BufferUtil
/* ------------------------------------------------------------ */
public static void readFrom(File file, ByteBuffer buffer) throws IOException
{
RandomAccessFile raf = new RandomAccessFile(file,"r");
FileChannel channel = raf.getChannel();
long needed=raf.length();
try(RandomAccessFile raf = new RandomAccessFile(file,"r");)
{
FileChannel channel = raf.getChannel();
long needed=raf.length();
while (needed>0 && buffer.hasRemaining())
needed=needed-channel.read(buffer);
while (needed>0 && buffer.hasRemaining())
needed=needed-channel.read(buffer);
}
}
/* ------------------------------------------------------------ */

View File

@ -36,6 +36,16 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* The @ManagedAttribute annotation is used to indicate that a given method
* exposes a JMX attribute. This annotation is placed always on the reader
* method of a given attribute. Unless it is marked as read-only in the
* configuration of the annotation a corresponding setter is looked for
* following normal naming conventions. For example if this annotation is
* on a method called getFoo() then a method called setFoo() would be looked
* for and if found wired automatically into the jmx attribute.
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target( { ElementType.METHOD } )

View File

@ -24,6 +24,14 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* The @ManagedObject annotation is used on a class at the top level to
* indicate that it should be exposed as an mbean. It has only one attribute
* to it which is used as the description of the MBean. Should multiple
* @ManagedObject annotations be found in the chain of influence then the
* first description is used.
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target( { ElementType.TYPE } )

View File

@ -36,6 +36,11 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* The @ManagedOperation annotation is used to indicate that a given method
* should be considered a JMX operation.
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target( { ElementType.METHOD } )

View File

@ -24,11 +24,28 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* This annotation is used to describe variables in method
* signatures so that when rendered into tools like JConsole
* it is clear what the parameters are. For example:
*
* public void doodle(@Name(value="doodle", description="A description of the argument") String doodle)
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target( { ElementType.PARAMETER } )
public @interface Name
{
/**
* the name of the parameter
* @return
*/
String value();
/**
* the description of the parameter
* @return
*/
String description() default "";
}

View File

@ -50,7 +50,10 @@ public class FileDestroyable implements Destroyable
public void addFile(String file) throws IOException
{
_files.add(Resource.newResource(file).getFile());
try(Resource r = Resource.newResource(file);)
{
_files.add(r.getFile());
}
}
public void addFile(File file)
@ -65,7 +68,10 @@ public class FileDestroyable implements Destroyable
public void removeFile(String file) throws IOException
{
_files.remove(Resource.newResource(file).getFile());
try(Resource r = Resource.newResource(file);)
{
_files.remove(r.getFile());
}
}
public void removeFile(File file)
@ -73,6 +79,7 @@ public class FileDestroyable implements Destroyable
_files.remove(file);
}
@Override
public void destroy()
{
for (File file : _files)

View File

@ -20,10 +20,8 @@ package org.eclipse.jetty.util.resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
@ -50,25 +48,24 @@ import org.eclipse.jetty.util.log.Logger;
*
*
*/
public class FileResource extends URLResource
public class FileResource extends Resource
{
private static final Logger LOG = Log.getLogger(FileResource.class);
/* ------------------------------------------------------------ */
private File _file;
private transient URL _alias=null;
private transient boolean _aliasChecked=false;
private final File _file;
private final String _uri;
private final URL _alias;
/* -------------------------------------------------------- */
public FileResource(URL url)
throws IOException, URISyntaxException
{
super(url,null);
File file;
try
{
// Try standard API to convert URL to file.
_file =new File(new URI(url.toString()));
file =new File(url.toURI());
}
catch (URISyntaxException e)
{
@ -76,48 +73,86 @@ public class FileResource extends URLResource
}
catch (Exception e)
{
if (!url.toString().startsWith("file:"))
throw new IllegalArgumentException("!file:");
LOG.ignore(e);
try
{
// Assume that File.toURL produced unencoded chars. So try
// encoding them.
// Assume that File.toURL produced unencoded chars. So try encoding them.
String file_url="file:"+URIUtil.encodePath(url.toString().substring(5));
URI uri = new URI(file_url);
if (uri.getAuthority()==null)
_file = new File(uri);
file = new File(uri);
else
_file = new File("//"+uri.getAuthority()+URIUtil.decodePath(url.getFile()));
file = new File("//"+uri.getAuthority()+URIUtil.decodePath(url.getFile()));
}
catch (Exception e2)
{
LOG.ignore(e2);
// Still can't get the file. Doh! try good old hack!
checkConnection();
Permission perm = _connection.getPermission();
_file = new File(perm==null?url.getFile():perm.getName());
URLConnection connection=url.openConnection();
Permission perm = connection.getPermission();
file = new File(perm==null?url.getFile():perm.getName());
}
}
if (_file.isDirectory())
{
if (!_urlString.endsWith("/"))
_urlString=_urlString+"/";
}
else
{
if (_urlString.endsWith("/"))
_urlString=_urlString.substring(0,_urlString.length()-1);
}
_file=file;
_uri=normalizeURI(_file,url.toURI());
_alias=checkAlias(_file);
}
/* -------------------------------------------------------- */
FileResource(URL url, URLConnection connection, File file)
public FileResource(URI uri)
{
super(url,connection);
File file=new File(uri);
_file=file;
if (_file.isDirectory() && !_urlString.endsWith("/"))
_urlString=_urlString+"/";
_uri=normalizeURI(_file,uri);
_alias=checkAlias(_file);
}
/* -------------------------------------------------------- */
FileResource(File file)
{
_file=file;
_uri=normalizeURI(_file,_file.toURI());
_alias=checkAlias(_file);
}
/* -------------------------------------------------------- */
private static String normalizeURI(File file, URI uri)
{
String u =uri.toASCIIString();
if (file.isDirectory())
{
if(!u.endsWith("/"))
u+="/";
}
else if (file.exists() && u.endsWith("/"))
u=u.substring(0,u.length()-1);
return u;
}
/* -------------------------------------------------------- */
private static URL checkAlias(File file)
{
try
{
String abs=file.getAbsolutePath();
String can=file.getCanonicalPath();
if (!abs.equals(can))
{
LOG.debug("ALIAS abs={} can={}",abs,can);
return new File(can).toURI().toURL();
}
}
catch(IOException e)
{
LOG.warn(e);
}
return null;
}
/* -------------------------------------------------------- */
@ -125,45 +160,35 @@ public class FileResource extends URLResource
public Resource addPath(String path)
throws IOException,MalformedURLException
{
URLResource r=null;
String url=null;
path = org.eclipse.jetty.util.URIUtil.canonicalPath(path);
if (path==null)
throw new MalformedURLException();
if ("/".equals(path))
return this;
else if (!isDirectory())
{
r=(FileResource)super.addPath(path);
url=r._urlString;
}
else
{
if (path==null)
throw new MalformedURLException();
// treat all paths being added as relative
String rel=path;
if (path.startsWith("/"))
rel = path.substring(1);
url=URIUtil.addPaths(_urlString,URIUtil.encodePath(rel));
r=(URLResource)Resource.newResource(url);
}
String encoded=URIUtil.encodePath(path);
int expected=r.toString().length()-encoded.length();
int index = r._urlString.lastIndexOf(encoded, expected);
path=URIUtil.encodePath(path);
if (expected!=index && ((expected-1)!=index || path.endsWith("/") || !r.isDirectory()))
URI uri;
try
{
if (!(r instanceof BadResource))
if (_file.isDirectory())
{
((FileResource)r)._alias=new URL(url);
((FileResource)r)._aliasChecked=true;
// treat all paths being added as relative
uri=new URI(URIUtil.addPaths(_uri,path));
}
}
return r;
else
{
uri=new URI(_uri+path);
}
}
catch(final URISyntaxException e)
{
throw new MalformedURLException(){{initCause(e);}};
}
return new FileResource(uri);
}
@ -171,30 +196,6 @@ public class FileResource extends URLResource
@Override
public URL getAlias()
{
if (!_aliasChecked)
{
try
{
String abs=_file.getAbsolutePath();
String can=_file.getCanonicalPath();
if (abs.length()!=can.length() || !abs.equals(can))
_alias=Resource.toURL(new File(can));
_aliasChecked=true;
if (_alias!=null && LOG.isDebugEnabled())
{
LOG.debug("ALIAS abs="+abs);
LOG.debug("ALIAS can="+can);
}
}
catch(Exception e)
{
LOG.warn(Log.EXCEPTION,e);
return getURL();
}
}
return _alias;
}
@ -220,12 +221,12 @@ public class FileResource extends URLResource
/* -------------------------------------------------------- */
/**
* Returns true if the respresenetd resource is a container/directory.
* Returns true if the resource is a container/directory.
*/
@Override
public boolean isDirectory()
{
return _file.isDirectory();
return _file.exists() && _file.isDirectory() || _uri.endsWith("/");
}
/* --------------------------------------------------------- */
@ -320,18 +321,6 @@ public class FileResource extends URLResource
}
return list;
}
/* ------------------------------------------------------------ */
/** Encode according to this resource type.
* File URIs are encoded.
* @param uri URI to encode.
* @return The uri unchanged.
*/
@Override
public String encode(String uri)
{
return uri;
}
/* ------------------------------------------------------------ */
/**
@ -377,4 +366,35 @@ public class FileResource extends URLResource
IO.copy(getFile(),destination);
}
}
@Override
public boolean isContainedIn(Resource r) throws MalformedURLException
{
return false;
}
@Override
public void close()
{
}
@Override
public URL getURL()
{
try
{
return _file.toURI().toURL();
}
catch (MalformedURLException e)
{
throw new IllegalStateException(e);
}
}
@Override
public String toString()
{
return _uri;
}
}

View File

@ -60,7 +60,7 @@ class JarFileResource extends JarResource
/* ------------------------------------------------------------ */
@Override
public synchronized void release()
public synchronized void close()
{
_list=null;
_entry=null;
@ -83,7 +83,7 @@ class JarFileResource extends JarResource
}
}
_jarFile=null;
super.release();
super.close();
}
/* ------------------------------------------------------------ */
@ -374,18 +374,6 @@ class JarFileResource extends JarResource
return -1;
}
/* ------------------------------------------------------------ */
/** Encode according to this resource type.
* File URIs are not encoded.
* @param uri URI to encode.
* @return The uri unchanged.
*/
@Override
public String encode(String uri)
{
return uri;
}
/**

View File

@ -55,10 +55,10 @@ public class JarResource extends URLResource
/* ------------------------------------------------------------ */
@Override
public synchronized void release()
public synchronized void close()
{
_jarConnection=null;
super.release();
super.close();
}
/* ------------------------------------------------------------ */

View File

@ -18,6 +18,7 @@
package org.eclipse.jetty.util.resource;
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@ -26,7 +27,6 @@ import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.nio.channels.ReadableByteChannel;
import java.text.DateFormat;
import java.util.Arrays;
@ -45,7 +45,7 @@ import org.eclipse.jetty.util.log.Logger;
/**
* Abstract resource class.
*/
public abstract class Resource implements ResourceFactory
public abstract class Resource implements ResourceFactory, Closeable
{
private static final Logger LOG = Log.getLogger(Resource.class);
public static boolean __defaultUseCaches = true;
@ -149,7 +149,7 @@ public abstract class Resource implements ResourceFactory
* @param useCaches controls URLConnection caching
* @return A Resource object.
*/
public static Resource newResource (String resource, boolean useCaches)
public static Resource newResource(String resource, boolean useCaches)
throws MalformedURLException, IOException
{
URL url=null;
@ -171,11 +171,7 @@ public abstract class Resource implements ResourceFactory
resource=resource.substring(2);
File file=new File(resource).getCanonicalFile();
url=Resource.toURL(file);
URLConnection connection=url.openConnection();
connection.setUseCaches(useCaches);
return new FileResource(url,connection,file);
return new FileResource(file);
}
catch(Exception e2)
{
@ -194,15 +190,9 @@ public abstract class Resource implements ResourceFactory
}
/* ------------------------------------------------------------ */
public static Resource newResource (File file)
throws MalformedURLException, IOException
public static Resource newResource(File file)
{
file = file.getCanonicalFile();
URL url = Resource.toURL(file);
URLConnection connection = url.openConnection();
FileResource fileResource = new FileResource(url, connection, file);
return fileResource;
return new FileResource(file);
}
/* ------------------------------------------------------------ */
@ -300,7 +290,7 @@ public abstract class Resource implements ResourceFactory
@Override
protected void finalize()
{
release();
close();
}
/* ------------------------------------------------------------ */
@ -309,9 +299,18 @@ public abstract class Resource implements ResourceFactory
/* ------------------------------------------------------------ */
/** Release any temporary resources held by the resource.
* @deprecated use {@link #close()}
*/
public abstract void release();
public final void release()
{
close();
}
/* ------------------------------------------------------------ */
/** Release any temporary resources held by the resource.
*/
@Override
public abstract void close();
/* ------------------------------------------------------------ */
/**
@ -420,19 +419,19 @@ public abstract class Resource implements ResourceFactory
/**
* Returns the resource contained inside the current resource with the
* given name.
* @param path The path segment to add, which should be encoded by the
* encode method.
* @param path The path segment to add, which is not encoded
*/
public abstract Resource addPath(String path)
throws IOException,MalformedURLException;
/* ------------------------------------------------------------ */
/** Get a resource from withing this resource.
/** Get a resource from within this resource.
* <p>
* This method is essentially an alias for {@link #addPath(String)}, but without checked exceptions.
* This method satisfied the {@link ResourceFactory} interface.
* @see org.eclipse.jetty.util.resource.ResourceFactory#getResource(java.lang.String)
*/
@Override
public Resource getResource(String path)
{
try
@ -447,14 +446,12 @@ public abstract class Resource implements ResourceFactory
}
/* ------------------------------------------------------------ */
/** Encode according to this resource type.
* The default implementation calls URI.encodePath(uri)
* @param uri
* @return String encoded for this resource type.
/**
* @deprecated
*/
public String encode(String uri)
{
return URIUtil.encodePath(uri);
return null;
}
/* ------------------------------------------------------------ */

View File

@ -21,7 +21,6 @@ package org.eclipse.jetty.util.resource;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.channels.ReadableByteChannel;
@ -32,7 +31,6 @@ import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.jetty.util.URIUtil;
import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -228,12 +226,15 @@ public class ResourceCollection extends Resource
Resource r = _resources[i].addPath(path);
if (r.exists() && r.isDirectory())
{
if (resources==null)
resources = new ArrayList<Resource>();
if (resource!=null)
{
resources = new ArrayList<Resource>();
resources.add(resource);
resource=null;
}
resources.add(r);
}
}
@ -443,13 +444,13 @@ public class ResourceCollection extends Resource
/* ------------------------------------------------------------ */
@Override
public void release()
public void close()
{
if(_resources==null)
throw new IllegalStateException("*resources* not set.");
for(Resource r : _resources)
r.release();
r.close();
}
/* ------------------------------------------------------------ */

View File

@ -81,7 +81,7 @@ public class URLResource extends Resource
/** Release any resources held by the resource.
*/
@Override
public synchronized void release()
public synchronized void close()
{
if (_in!=null)
{

View File

@ -0,0 +1,118 @@
//
// ========================================================================
// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.util.resource;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import junit.framework.Assert;
import org.eclipse.jetty.toolchain.test.FS;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.toolchain.test.TestingDir;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class ResourceAliasTest
{
static File __dir;
@BeforeClass
public static void beforeClass()
{
__dir=MavenTestingUtils.getTargetTestingDir("RAT");
}
@Before
public void before()
{
FS.ensureDirExists(__dir);
FS.ensureEmpty(__dir);
}
/* ------------------------------------------------------------ */
@Test
public void testNullCharEndingFilename() throws Exception
{
File file=new File(__dir,"test.txt");
assertFalse(file.exists());
file.createNewFile();
assertTrue(file.exists());
File file0=new File(__dir,"test.txt\0");
if (!file0.exists())
return; // this file system does not suffer this problem
assertTrue(file0.exists()); // This is an alias!
Resource dir = Resource.newResource(__dir);
// Test not alias paths
Resource resource = Resource.newResource(file);
assertTrue(resource.exists());
assertNull(resource.getAlias());
resource = Resource.newResource(file.getAbsoluteFile());
assertTrue(resource.exists());
assertNull(resource.getAlias());
resource = Resource.newResource(file.toURI());
assertTrue(resource.exists());
assertNull(resource.getAlias());
resource = Resource.newResource(file.toURI().toString());
assertTrue(resource.exists());
assertNull(resource.getAlias());
resource = dir.addPath("test.txt");
assertTrue(resource.exists());
assertNull(resource.getAlias());
// Test alias paths
resource = Resource.newResource(file0);
assertTrue(resource.exists());
assertNotNull(resource.getAlias());
resource = Resource.newResource(file0.getAbsoluteFile());
assertTrue(resource.exists());
assertNotNull(resource.getAlias());
resource = Resource.newResource(file0.toURI());
assertTrue(resource.exists());
assertNotNull(resource.getAlias());
resource = Resource.newResource(file0.toURI().toString());
assertTrue(resource.exists());
assertNotNull(resource.getAlias());
try
{
resource = dir.addPath("test.txt\0");
assertTrue(resource.exists());
assertNotNull(resource.getAlias());
}
catch(MalformedURLException e)
{
assertTrue(true);
}
}
}

View File

@ -33,12 +33,8 @@ import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.TimeZone;
import java.util.jar.JarFile;
import java.util.zip.ZipFile;
import junit.framework.Assert;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.toolchain.test.OS;
import org.eclipse.jetty.util.IO;
@ -329,13 +325,13 @@ public class ResourceTest
{
String s = "jar:"+__userURL+"TestData/test.zip!/subdir/numbers";
ZipFile zf = new ZipFile(MavenTestingUtils.getTestResourceFile("TestData/test.zip"));
long last = zf.getEntry("subdir/numbers").getTime();
try(ZipFile zf = new ZipFile(MavenTestingUtils.getTestResourceFile("TestData/test.zip")))
{
long last = zf.getEntry("subdir/numbers").getTime();
Resource r = Resource.newResource(s);
assertEquals(last,r.lastModified());
Resource r = Resource.newResource(s);
assertEquals(last,r.lastModified());
}
}
/* ------------------------------------------------------------ */
@ -367,6 +363,7 @@ public class ResourceTest
assertEquals(1, dest.getParentFile().listFiles().length);
FilenameFilter dotdotFilenameFilter = new FilenameFilter() {
@Override
public boolean accept(File directory, String name)
{
return name.equals("dotdot.txt");
@ -376,6 +373,7 @@ public class ResourceTest
assertEquals(0, dest.getParentFile().listFiles(dotdotFilenameFilter).length);
FilenameFilter extractfileFilenameFilter = new FilenameFilter() {
@Override
public boolean accept(File directory, String name)
{
return name.equals("extract-filenotdir");
@ -385,6 +383,7 @@ public class ResourceTest
assertEquals(0, dest.getParentFile().listFiles(extractfileFilenameFilter).length);
FilenameFilter currentDirectoryFilenameFilter = new FilenameFilter() {
@Override
public boolean accept(File directory, String name)
{
return name.equals("current.txt");
@ -405,15 +404,14 @@ public class ResourceTest
{
final String classPathName="Resource.class";
Resource resource=Resource.newClassPathResource(classPathName);
try(Resource resource=Resource.newClassPathResource(classPathName);)
{
// A class path cannot be a directory
assertFalse("Class path cannot be a directory.",resource.isDirectory());
assertTrue(resource!=null);
// A class path cannot be a directory
assertFalse("Class path cannot be a directory.",resource.isDirectory());
// A class path must exist
assertTrue("Class path resource does not exist.",resource.exists());
// A class path must exist
assertTrue("Class path resource does not exist.",resource.exists());
}
}
/**
@ -426,8 +424,6 @@ public class ResourceTest
Resource resource=Resource.newClassPathResource(classPathName);
assertTrue(resource!=null);
// A class path cannot be a directory
assertFalse("Class path cannot be a directory.",resource.isDirectory());
@ -445,9 +441,6 @@ public class ResourceTest
Resource resource=Resource.newClassPathResource(classPathName);
assertTrue(resource!=null);
// A class path must be a directory
assertTrue("Class path must be a directory.",resource.isDirectory());
@ -469,8 +462,6 @@ public class ResourceTest
// Will locate a resource in the class path
Resource resource=Resource.newClassPathResource(classPathName);
assertTrue(resource!=null);
// A class path cannot be a directory
assertFalse("Class path must be a directory.",resource.isDirectory());
@ -478,7 +469,6 @@ public class ResourceTest
File file=resource.getFile();
assertTrue("File returned from class path should not be null.",file!=null);
assertEquals("File name from class path is not equal.",fileName,file.getName());
assertTrue("File returned from class path should be a file.",file.isFile());

View File

@ -66,7 +66,7 @@ public abstract class Descriptor
}
finally
{
_xml.release();
_xml.close();
}
}
}

View File

@ -167,10 +167,10 @@ public class OrderingTest
}
/**
* @see org.eclipse.jetty.util.resource.Resource#release()
* @see org.eclipse.jetty.util.resource.Resource#close()
*/
@Override
public void release()
public void close()
{
}

View File

@ -60,7 +60,7 @@ public class WebAppClassLoaderTest
assertTrue(cantLoadClass("org.eclipse.jetty.webapp.Configuration"));
Class clazzA = _loader.loadClass("org.acme.webapp.ClassInJarA");
Class<?> clazzA = _loader.loadClass("org.acme.webapp.ClassInJarA");
assertTrue(clazzA.getField("FROM_PARENT")!=null);
}

View File

@ -741,7 +741,6 @@ public class XmlConfiguration
private Object newObj(Object obj, XmlParser.Node node) throws Exception
{
Class<?> oClass = nodeClass(node);
int size = 0;
int argIndex = node.size();
for (int i = 0; i < node.size(); i++)
{
@ -753,13 +752,12 @@ public class XmlConfiguration
argIndex = i;
break;
}
size++;
}
Map<String, Object> namedArgMap = new HashMap<>();
List<Object> arguments = new LinkedList<>();
for (int i = 0; i < size; i++)
for (int i = 0; i < node.size(); i++)
{
Object o = node.get(i);

View File

@ -25,6 +25,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
@ -541,6 +542,34 @@ public class XmlConfigurationTest
Assert.assertEquals("nested second parameter not wired correctly","arg2", atc.getNested().getSecond());
Assert.assertEquals("nested third parameter not wired correctly","arg3", atc.getNested().getThird());
}
@Test
public void testArgumentsGetIgnoredMissingDTD() throws Exception
{
XmlConfiguration xmlConfiguration = new XmlConfiguration(new ByteArrayInputStream(("" +
"<Configure class=\"org.eclipse.jetty.xml.AnnotatedTestConfiguration\">" +
" <Arg>arg1</Arg> " +
" <Arg>arg2</Arg> " +
" <Arg>arg3</Arg> " +
" <Set name=\"nested\"> " +
" <New class=\"org.eclipse.jetty.xml.AnnotatedTestConfiguration\">\n" +
" <Arg>arg1</Arg>\n" +
" <Arg>arg2</Arg>\n" +
" <Arg>arg3</Arg>\n" +
" </New>" +
" </Set>" +
"</Configure>").getBytes("ISO-8859-1")));
// XmlConfiguration xmlConfiguration = new XmlConfiguration(url);
AnnotatedTestConfiguration atc = (AnnotatedTestConfiguration)xmlConfiguration.configure();
Assert.assertEquals("first parameter not wired correctly","arg1", atc.getFirst());
Assert.assertEquals("second parameter not wired correctly","arg2", atc.getSecond());
Assert.assertEquals("third parameter not wired correctly","arg3", atc.getThird());
Assert.assertEquals("nested first parameter not wired correctly","arg1", atc.getNested().getFirst());
Assert.assertEquals("nested second parameter not wired correctly","arg2", atc.getNested().getSecond());
Assert.assertEquals("nested third parameter not wired correctly","arg3", atc.getNested().getThird());
}
@Test
public void testNestedConstructorNamedInjectionUnorderedMixed() throws Exception