Merged branch 'jetty-9.4.x' into 'jetty-9.4.x-2796-http2_max_concurrent_streams'.

This commit is contained in:
Simone Bordet 2018-10-29 19:05:35 +01:00
commit b70323d55f
72 changed files with 786 additions and 532 deletions

View File

@ -95,10 +95,6 @@
<artifactId>test-mock-resources</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-proxy</artifactId>
@ -128,7 +124,12 @@
<groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>javax.mail.glassfish</artifactId>
</dependency>
<dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId>
<!-- scope>test</scope-->

View File

@ -60,7 +60,7 @@ public class LikeJettyXml
public static void main( String[] args ) throws Exception
{
// Path to as-built jetty-distribution directory
String jettyHomeBuild = "../../jetty-distribution/target/distribution";
String jettyHomeBuild = "jetty-distribution/target/distribution";
// Find jetty home and base directories
String homePath = System.getProperty("jetty.home", jettyHomeBuild);

View File

@ -137,7 +137,7 @@ public class ManyConnectors
// Start the server
server.start();
server.dumpStdErr();
server.join();
}
}

View File

@ -50,6 +50,7 @@ public class ManyContexts
server.setHandler(contexts);
server.start();
server.dumpStdErr();
server.join();
}
}

View File

@ -58,6 +58,7 @@ public class OneServletContextWithSession
context.addServlet(HelloSessionServlet.class, "/");
server.start();
server.dumpStdErr();
server.join();
}
}

View File

@ -52,7 +52,7 @@ public class ServerWithAnnotations
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
File warFile = new File(
"../../jetty-distribution/target/distribution/demo-base/webapps/test.war");
"jetty-distribution/target/distribution/demo-base/webapps/test.war");
webapp.setWar(warFile.getAbsolutePath());
webapp.setAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
@ -72,10 +72,11 @@ public class ServerWithAnnotations
// Configure a LoginService
HashLoginService loginService = new HashLoginService();
loginService.setName("Test Realm");
loginService.setConfig("src/test/resources/realm.properties");
loginService.setConfig("examples/embedded/src/test/resources/realm.properties");
server.addBean(loginService);
server.start();
server.dumpStdErr();
server.join();
}

View File

@ -28,7 +28,6 @@ import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -212,6 +211,6 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
}

View File

@ -35,7 +35,8 @@ import org.eclipse.jetty.client.api.Destination;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.component.DumpableCollection;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.Sweeper;
@ -239,20 +240,24 @@ public class DuplexConnectionPool extends AbstractConnectionPool implements Swee
@Override
public void dump(Appendable out, String indent) throws IOException
{
List<Connection> connections = new ArrayList<>();
DumpableCollection active;
DumpableCollection idle;
lock();
try
{
connections.addAll(activeConnections);
connections.addAll(idleConnections);
active = new DumpableCollection("active",new ArrayList<>(activeConnections));
idle = new DumpableCollection("idle",new ArrayList<>(idleConnections));
}
finally
{
unlock();
}
dump(out, indent, active, idle);
}
ContainerLifeCycle.dumpObject(out, this);
ContainerLifeCycle.dump(out, indent, connections);
protected void dump(Appendable out, String indent, Object... items) throws IOException
{
Dumpable.dumpObjects(out, indent, this, items);
}
@Override

View File

@ -472,8 +472,7 @@ public abstract class HttpDestination extends ContainerLifeCycle implements Dest
@Override
public void dump(Appendable out, String indent) throws IOException
{
super.dump(out, indent);
ContainerLifeCycle.dump(out, indent, Collections.singleton(new DumpableCollection("exchanges", exchanges)));
dumpBeans(out, indent, new DumpableCollection("exchanges", exchanges));
}
public String asString()

View File

@ -31,7 +31,8 @@ import java.util.stream.Collectors;
import org.eclipse.jetty.client.api.Connection;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.component.DumpableCollection;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.Sweeper;
@ -310,21 +311,22 @@ public class MultiplexConnectionPool extends AbstractConnectionPool implements C
@Override
public void dump(Appendable out, String indent) throws IOException
{
List<Holder> connections = new ArrayList<>();
DumpableCollection busy;
DumpableCollection muxed;
DumpableCollection idle;
lock();
try
{
connections.addAll(busyConnections.values());
connections.addAll(muxedConnections.values());
connections.addAll(idleConnections);
busy = new DumpableCollection("busy", new ArrayList<>(busyConnections.values()));
muxed = new DumpableCollection("muxed", new ArrayList<>(muxedConnections.values()));
idle = new DumpableCollection("idle", new ArrayList<>(idleConnections));
}
finally
{
unlock();
}
ContainerLifeCycle.dumpObject(out, this);
ContainerLifeCycle.dump(out, indent, connections);
Dumpable.dumpObjects(out, indent, this, busy, muxed, idle);
}
@Override

View File

@ -26,7 +26,7 @@ import org.eclipse.jetty.client.api.Connection;
import org.eclipse.jetty.client.api.Destination;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
@ManagedObject
public class RoundRobinConnectionPool extends AbstractConnectionPool implements ConnectionPool.Multiplexable
@ -192,8 +192,7 @@ public class RoundRobinConnectionPool extends AbstractConnectionPool implements
{
connections = new ArrayList<>(entries);
}
ContainerLifeCycle.dumpObject(out, this);
ContainerLifeCycle.dump(out, indent, connections);
Dumpable.dumpObjects(out, indent, out, connections);
}
@Override

View File

@ -23,12 +23,13 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Stream;
import org.eclipse.jetty.client.api.Connection;
import org.eclipse.jetty.client.api.Destination;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.DumpableCollection;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.Scheduler;
@ -129,10 +130,10 @@ public class ValidatingConnectionPool extends DuplexConnectionPool
}
@Override
public void dump(Appendable out, String indent) throws IOException
protected void dump(Appendable out, String indent, Object... items) throws IOException
{
super.dump(out, indent);
ContainerLifeCycle.dump(out, indent, quarantine.values());
DumpableCollection toDump = new DumpableCollection("quarantine", quarantine.values());
super.dump(out, indent, Stream.concat(Stream.of(items), Stream.of(toDump)));
}
@Override

View File

@ -624,6 +624,9 @@ Only relevant if `waitForChild` is `false`.
forkWebXml::
Default is `target/fork-web.xml`.
This is the name of the file into which jetty generates the effective web.xml for use by the child process.
javaPath::
Default will be your `${java.home}/bin/java`
This the java executable used to start the child process
The following `jetty:run` parameters are NOT applicable:
@ -715,6 +718,9 @@ maxChildCheckInterval::
Default value 100.
This is the interval in milliseconds between checks to see if the child started correctly.
Only applicable if `waitForChild` is `false`.
javaPath::
Default will be your `${java.home}/bin/java`
This the java executable used to start the child process
____
[NOTE]

View File

@ -31,7 +31,6 @@ import org.eclipse.jetty.util.ArrayTernaryTrie;
import org.eclipse.jetty.util.Trie;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -56,14 +55,13 @@ public class PathMappings<E> implements Iterable<MappedResource<E>>, Dumpable
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
out.append("PathMappings[size=").append(Integer.toString(_mappings.size())).append("]\n");
ContainerLifeCycle.dump(out, indent, _mappings);
Dumpable.dumpObjects(out, indent, toString(), _mappings);
}
@ManagedAttribute(value = "mappings", readonly = true)

View File

@ -29,7 +29,6 @@ import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.annotation.ManagedOperation;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -243,7 +242,7 @@ public abstract class AbstractFlowControlStrategy implements FlowControlStrategy
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override

View File

@ -34,7 +34,6 @@ import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EofException;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.IteratingCallback;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -353,7 +352,7 @@ public class HTTP2Flusher extends IteratingCallback implements Dumpable
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override

View File

@ -1208,8 +1208,7 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio
@Override
public void dump(Appendable out, String indent) throws IOException
{
super.dump(out, indent);
dump(out, indent, Collections.singleton(new DumpableCollection("streams", streams.values())));
dumpBeans(out, indent, new DumpableCollection("streams", streams.values()));
}
@Override

View File

@ -42,7 +42,6 @@ import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
import org.eclipse.jetty.io.IdleTimeout;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -641,7 +640,7 @@ public class HTTP2Stream extends IdleTimeout implements IStream, Callback, Dumpa
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override

View File

@ -43,7 +43,6 @@ import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.annotation.Name;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.component.LifeCycle;
@ -288,14 +287,13 @@ public abstract class AbstractHTTP2ServerConnectionFactory extends AbstractConne
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
ContainerLifeCycle.dumpObject(out, this);
ContainerLifeCycle.dump(out, indent, sessions);
Dumpable.dumpObjects(out,indent,this, sessions);
}
@Override

View File

@ -19,8 +19,6 @@
package org.eclipse.jetty.io;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;
@ -29,7 +27,6 @@ import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.annotation.ManagedOperation;
import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.statistic.CounterStatistic;
import org.eclipse.jetty.util.statistic.SampleStatistic;
@ -210,19 +207,17 @@ public class ConnectionStatistics extends AbstractLifeCycle implements Connectio
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
ContainerLifeCycle.dumpObject(out, this);
List<String> children = new ArrayList<>();
children.add(String.format("connections=%s", _connections));
children.add(String.format("durations=%s", _connectionsDuration));
children.add(String.format("bytes in/out=%s/%s", getReceivedBytes(), getSentBytes()));
children.add(String.format("messages in/out=%s/%s", getReceivedMessages(), getSentMessages()));
ContainerLifeCycle.dump(out, indent, children);
Dumpable.dumpObjects(out,indent,this,
String.format("connections=%s", _connections),
String.format("durations=%s", _connectionsDuration),
String.format("bytes in/out=%s/%s", getReceivedBytes(), getSentBytes()),
String.format("messages in/out=%s/%s", getReceivedMessages(), getSentMessages()));
}
@Override

View File

@ -296,8 +296,10 @@ public class ManagedSelector extends ContainerLifeCycle implements Dumpable
String keysAt = DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now());
if (keys==null)
keys = Collections.singletonList("No dump keys retrieved");
dumpBeans(out, indent, Arrays.asList(new DumpableCollection("updates @ "+updatesAt, updates),
new DumpableCollection("keys @ "+keysAt, keys)));
dumpBeans(out, indent,
new DumpableCollection("updates @ "+updatesAt, updates),
new DumpableCollection("keys @ "+keysAt, keys));
}
else
{
@ -543,7 +545,7 @@ public class ManagedSelector extends ContainerLifeCycle implements Dumpable
*/
public interface SelectorUpdate
{
public void update(Selector selector);
void update(Selector selector);
}
private class Start implements SelectorUpdate
@ -567,8 +569,7 @@ public class ManagedSelector extends ContainerLifeCycle implements Dumpable
public void update(Selector selector)
{
Set<SelectionKey> selector_keys = selector.keys();
List<String> list = new ArrayList<>(selector_keys.size()+1);
list.add(selector + " keys=" + selector_keys.size());
List<String> list = new ArrayList<>(selector_keys.size());
for (SelectionKey key : selector_keys)
{
if (key==null)

View File

@ -398,14 +398,13 @@ public class MBeanContainer implements Container.InheritedListener, Dumpable, De
@Override
public void dump(Appendable out, String indent) throws IOException
{
ContainerLifeCycle.dumpObject(out, this);
ContainerLifeCycle.dump(out, indent, _mbeans.entrySet());
Dumpable.dumpObjects(out, indent, this, _mbeans.entrySet());
}
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override

View File

@ -93,6 +93,7 @@
</goals>
<configuration>
<jettyBase>${basedir}/src/base</jettyBase>
<javaPath>${java.home}/bin/java</javaPath>
<jettyProperties>
<jettyProperty>jetty.server.dumpAfterStart=true</jettyProperty>
<jettyProperty>jetty.port.file=${jetty.port.file}</jettyProperty>

View File

@ -199,6 +199,8 @@ public class JettyRunDistro extends JettyRunMojo
private Path tokenFile;
@Parameter(property = "jetty.javaPath")
private String javaPath;
/**
* @see org.eclipse.jetty.maven.plugin.JettyRunMojo#execute()
@ -492,7 +494,14 @@ public class JettyRunDistro extends JettyRunMojo
public ProcessBuilder configureCommand()
{
List<String> cmd = new ArrayList<>();
cmd.add("java");
if(StringUtil.isNotBlank( javaPath ))
{
cmd.add( javaPath );
}
else
{
cmd.add( getJavaBin() );
}
cmd.add("-jar");
cmd.add(new File(jettyHome, "start.jar").getAbsolutePath());

View File

@ -44,6 +44,7 @@ import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
@ -152,6 +153,8 @@ public class JettyRunForkedMojo extends JettyRunMojo
*/
private boolean hasSlf4jDeps;
@Parameter(property = "jetty.javaPath")
private String javaPath;
/**
* ShutdownThread
@ -271,7 +274,14 @@ public class JettyRunForkedMojo extends JettyRunMojo
tpool.stop();
List<String> cmd = new ArrayList<>();
cmd.add(getJavaBin());
if( StringUtil.isNotBlank( javaPath ))
{
cmd.add( javaPath );
}
else
{
cmd.add( getJavaBin() );
}
if (jvmArgs != null)
{
@ -307,7 +317,6 @@ public class JettyRunForkedMojo extends JettyRunMojo
cmd.add("--props");
cmd.add(props.getAbsolutePath());
String token = createToken();
Path tokenFile = target.toPath().resolve(createToken()+".txt");
cmd.add("--token");
cmd.add(tokenFile.toAbsolutePath().toString());
@ -510,45 +519,6 @@ public class JettyRunForkedMojo extends JettyRunMojo
/**
* @return
*/
private String getJavaBin()
{
String javaexes[] = new String[]
{ "java", "java.exe" };
File javaHomeDir = new File(System.getProperty("java.home"));
for (String javaexe : javaexes)
{
File javabin = new File(javaHomeDir,fileSeparators("bin/" + javaexe));
if (javabin.exists() && javabin.isFile())
{
return javabin.getAbsolutePath();
}
}
return "java";
}
public static String fileSeparators(String path)
{
StringBuilder ret = new StringBuilder();
for (char c : path.toCharArray())
{
if ((c == '/') || (c == '\\'))
{
ret.append(File.separatorChar);
}
else
{
ret.append(c);
}
}
return ret.toString();
}
public static String pathSeparators(String path)
{
StringBuilder ret = new StringBuilder();

View File

@ -738,4 +738,44 @@ public class JettyRunMojo extends AbstractJettyMojo
return null;
}
/**
* @return
*/
protected String getJavaBin()
{
String javaexes[] = new String[]
{ "java", "java.exe" };
File javaHomeDir = new File(System.getProperty("java.home"));
for (String javaexe : javaexes)
{
File javabin = new File(javaHomeDir,fileSeparators("bin/" + javaexe));
if (javabin.exists() && javabin.isFile())
{
return javabin.getAbsolutePath();
}
}
return "java";
}
public static String fileSeparators(String path)
{
StringBuilder ret = new StringBuilder();
for (char c : path.toCharArray())
{
if ((c == '/') || (c == '\\'))
{
ret.append(File.separatorChar);
}
else
{
ret.append(c);
}
}
return ret.toString();
}
}

View File

@ -486,13 +486,6 @@ public class ConnectHandler extends HandlerWrapper
return true;
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
dumpThis(out);
dump(out, indent, getBeans(), TypeUtil.asList(getHandlers()));
}
protected class ConnectManager extends SelectorManager
{
protected ConnectManager(Executor executor, Scheduler scheduler, int selectors)

View File

@ -153,7 +153,7 @@ public abstract class AbstractLoginService extends AbstractLifeCycle implements
@Override
public String toString()
{
return this.getClass().getSimpleName()+"["+_name+"]";
return String.format("%s@%x[%s]", this.getClass().getSimpleName(), hashCode(), _name);
}

View File

@ -46,6 +46,7 @@ import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.server.UserIdentity;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.util.URIUtil;
import org.eclipse.jetty.util.component.DumpableCollection;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.security.Constraint;
@ -765,13 +766,9 @@ public class ConstraintSecurityHandler extends SecurityHandler implements Constr
@Override
public void dump(Appendable out,String indent) throws IOException
{
// TODO these should all be beans
dumpBeans(out,indent,
Collections.singleton(getLoginService()),
Collections.singleton(getIdentityService()),
Collections.singleton(getAuthenticator()),
Collections.singleton(_roles),
_constraintMap.entrySet());
DumpableCollection.from("roles",_roles),
DumpableCollection.from("constraints",_constraintMap.entrySet()));
}
/* ------------------------------------------------------------ */

View File

@ -20,11 +20,9 @@ package org.eclipse.jetty.server;
import java.io.IOException;
import java.net.URLClassLoader;
import java.util.Collections;
import org.eclipse.jetty.util.TypeUtil;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.component.DumpableCollection;
public class ClassLoaderDump implements Dumpable
{
@ -38,7 +36,7 @@ public class ClassLoaderDump implements Dumpable
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override
@ -48,31 +46,34 @@ public class ClassLoaderDump implements Dumpable
out.append("No ClassLoader\n");
else if (_loader instanceof Dumpable)
{
ContainerLifeCycle.dump(out,indent,Collections.singleton(_loader));
((Dumpable)_loader).dump(out,indent);
}
else if (_loader instanceof URLClassLoader)
{
out.append(String.valueOf(_loader)).append("\n");
String loader = _loader.toString();
DumpableCollection urls = DumpableCollection.fromArray("URLs", ((URLClassLoader)_loader).getURLs());
ClassLoader parent = _loader.getParent();
if (parent==null)
ContainerLifeCycle.dump(out,indent,TypeUtil.asList(((URLClassLoader)_loader).getURLs()));
Dumpable.dumpObjects(out,indent,loader,urls);
else if (parent == Server.class.getClassLoader())
ContainerLifeCycle.dump(out,indent,TypeUtil.asList(((URLClassLoader)_loader).getURLs()),Collections.singleton(parent.toString()));
Dumpable.dumpObjects(out,indent,loader,urls,parent.toString());
else if (parent instanceof Dumpable)
ContainerLifeCycle.dump(out,indent,TypeUtil.asList(((URLClassLoader)_loader).getURLs()),Collections.singleton(parent));
Dumpable.dumpObjects(out,indent,loader,urls,parent);
else
ContainerLifeCycle.dump(out,indent,TypeUtil.asList(((URLClassLoader)_loader).getURLs()),Collections.singleton(new ClassLoaderDump(parent)));
Dumpable.dumpObjects(out,indent,loader,urls,new ClassLoaderDump(parent));
}
else
{
out.append(String.valueOf(_loader)).append("\n");
String loader = _loader.toString();
ClassLoader parent = _loader.getParent();
if (parent==null)
Dumpable.dumpObject(out,loader);
if (parent==Server.class.getClassLoader())
ContainerLifeCycle.dump(out,indent,Collections.singleton(parent.toString()));
Dumpable.dumpObjects(out,indent,loader,parent.toString());
else if (parent instanceof Dumpable)
ContainerLifeCycle.dump(out,indent,Collections.singleton(parent));
Dumpable.dumpObjects(out,indent,loader,parent);
else if (parent!=null)
ContainerLifeCycle.dump(out,indent,Collections.singleton(new ClassLoaderDump(parent)));
Dumpable.dumpObjects(out,indent,loader,new ClassLoaderDump(parent));
}
}
}

View File

@ -19,7 +19,6 @@
package org.eclipse.jetty.server;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@ -33,7 +32,6 @@ import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.annotation.ManagedOperation;
import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.component.Container;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.statistic.CounterStatistic;
import org.eclipse.jetty.util.statistic.SampleStatistic;
@ -240,14 +238,17 @@ public class ConnectorStatistics extends AbstractLifeCycle implements Dumpable,
@ManagedOperation("dump thread state")
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
ContainerLifeCycle.dumpObject(out,this);
ContainerLifeCycle.dump(out,indent,Arrays.asList(new String[]{"connections="+_connectionStats,"duration="+_connectionDurationStats,"in="+_messagesIn,"out="+_messagesOut}));
Dumpable.dumpObjects(out,indent,this,
"connections="+_connectionStats,
"duration="+_connectionDurationStats,
"in="+_messagesIn,
"out="+_messagesOut);
}
public static void addToAllConnectors(Server server)

View File

@ -42,6 +42,7 @@ import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.annotation.Name;
import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -127,12 +128,16 @@ public class DebugListener extends AbstractLifeCycle implements ServletContextLi
if (_dumpContext)
{
if (_out==null)
{
handler.dumpStdErr();
System.err.println(Dumpable.KEY);
}
else
{
try
{
handler.dump(_out);
_out.println(Dumpable.KEY);
}
catch(Exception e)
{

View File

@ -481,33 +481,38 @@ public class HttpChannel implements Runnable, HttpOutput.Interceptor
case COMPLETE:
{
if (!_response.isCommitted() && !_request.isHandled())
try
{
_response.sendError(HttpStatus.NOT_FOUND_404);
}
else
{
// RFC 7230, section 3.3.
int status = _response.getStatus();
boolean hasContent = !(_request.isHead() ||
if (!_response.isCommitted() && !_request.isHandled())
{
_response.sendError(HttpStatus.NOT_FOUND_404);
}
else
{
// RFC 7230, section 3.3.
int status = _response.getStatus();
boolean hasContent = !(_request.isHead() ||
HttpMethod.CONNECT.is(_request.getMethod()) && status == HttpStatus.OK_200 ||
HttpStatus.isInformational(status) ||
status == HttpStatus.NO_CONTENT_204 ||
status == HttpStatus.NOT_MODIFIED_304);
if (hasContent && !_response.isContentComplete(_response.getHttpOutput().getWritten()))
{
if (isCommitted())
abort(new IOException("insufficient content written"));
else
_response.sendError(HttpStatus.INTERNAL_SERVER_ERROR_500,"insufficient content written");
if (hasContent && !_response.isContentComplete(_response.getHttpOutput().getWritten()))
{
if (isCommitted())
abort(new IOException("insufficient content written"));
else
_response.sendError(HttpStatus.INTERNAL_SERVER_ERROR_500, "insufficient content written");
}
}
_response.closeOutput();
}
finally
{
_request.setHandled(true);
_state.onComplete();
onCompleted();
}
_response.closeOutput();
_request.setHandled(true);
_state.onComplete();
onCompleted();
break loop;
}

View File

@ -455,23 +455,21 @@ public class Request implements HttpServletRequest
/* ------------------------------------------------------------ */
private void extractContentParameters()
{
// Content cannot be encoded
if (_metaData!=null && getHttpFields().contains(HttpHeader.CONTENT_ENCODING))
throw new BadMessageException(HttpStatus.NOT_IMPLEMENTED_501,"Unsupported Content-Encoding");
String contentType = getContentType();
if (contentType == null || contentType.isEmpty())
_contentParameters=NO_PARAMS;
else
{
_contentParameters=new MultiMap<>();
contentType = HttpFields.valueParameters(contentType, null);
int contentLength = getContentLength();
if (contentLength != 0 && _inputState == __NONE)
{
contentType = HttpFields.valueParameters(contentType, null);
if (MimeTypes.Type.FORM_ENCODED.is(contentType) &&
_channel.getHttpConfiguration().isFormEncodedMethod(getMethod()))
{
if (_metaData!=null && getHttpFields().contains(HttpHeader.CONTENT_ENCODING))
throw new BadMessageException(HttpStatus.NOT_IMPLEMENTED_501,"Unsupported Content-Encoding");
extractFormParameters(_contentParameters);
}
else if (MimeTypes.Type.MULTIPART_FORM_DATA.is(contentType) &&
@ -480,6 +478,8 @@ public class Request implements HttpServletRequest
{
try
{
if (_metaData!=null && getHttpFields().contains(HttpHeader.CONTENT_ENCODING))
throw new BadMessageException(HttpStatus.NOT_IMPLEMENTED_501,"Unsupported Content-Encoding");
getParts(_contentParameters);
}
catch (IOException | ServletException e)
@ -490,7 +490,6 @@ public class Request implements HttpServletRequest
}
}
}
}
/* ------------------------------------------------------------ */

View File

@ -628,6 +628,7 @@ public class Server extends HandlerWrapper implements Attributes
@Override
public void setAttribute(String name, Object attribute)
{
// TODO this is a crude way to get attribute values managed by JMX.
Object old=_attributes.getAttribute(name);
updateBean(old,attribute);
_attributes.setAttribute(name, attribute);
@ -690,7 +691,7 @@ public class Server extends HandlerWrapper implements Attributes
@Override
public void dump(Appendable out,String indent) throws IOException
{
dumpBeans(out,indent,Collections.singleton(new ClassLoaderDump(this.getClass().getClassLoader())));
dumpBeans(out,indent,new ClassLoaderDump(this.getClass().getClassLoader()),_attributes);
}
/* ------------------------------------------------------------ */

View File

@ -20,6 +20,7 @@ package org.eclipse.jetty.server;
import java.io.Closeable;
import java.io.IOException;
import java.net.BindException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
@ -336,7 +337,14 @@ public class ServerConnector extends AbstractNetworkConnector
InetSocketAddress bindAddress = getHost() == null ? new InetSocketAddress(getPort()) : new InetSocketAddress(getHost(), getPort());
serverChannel.socket().setReuseAddress(getReuseAddress());
serverChannel.socket().bind(bindAddress, getAcceptQueueSize());
try
{
serverChannel.socket().bind(bindAddress, getAcceptQueueSize());
}
catch (BindException e)
{
throw new IOException("Failed to bind to " + bindAddress, e);
}
}
return serverChannel;

View File

@ -256,11 +256,12 @@ public class ContextHandler extends ScopedHandler implements Attributes, Gracefu
@Override
public void dump(Appendable out, String indent) throws IOException
{
dumpBeans(out,indent,Collections.singletonList(new ClassLoaderDump(getClassLoader())),
Collections.singletonList(new DumpableCollection("eventListeners "+this,_eventListeners)),
Collections.singletonList(new DumpableCollection("handler attributes " + this,((AttributesMap)getAttributes()).getAttributeEntrySet())),
Collections.singletonList(new DumpableCollection("context attributes " + this,((Context)getServletContext()).getAttributeEntrySet())),
Collections.singletonList(new DumpableCollection("initparams " + this,getInitParams().entrySet())));
dumpBeans(out, indent,
new ClassLoaderDump(getClassLoader()),
new DumpableCollection("eventListeners " + this, _eventListeners),
new DumpableCollection("handler attributes " + this, ((AttributesMap)getAttributes()).getAttributeEntrySet()),
new DumpableCollection("context attributes " + this, ((Context)getServletContext()).getAttributeEntrySet()),
new DumpableCollection("initparams " + this,getInitParams().entrySet()));
}
/* ------------------------------------------------------------ */
@ -677,7 +678,11 @@ public class ContextHandler extends ScopedHandler implements Attributes, Gracefu
_durableListeners.add(listener);
if (listener instanceof ContextScopeListener)
{
_contextListeners.add((ContextScopeListener)listener);
if (__context.get()!=null)
((ContextScopeListener)listener).enterScope(__context.get(),null,"Listener registered");
}
if (listener instanceof ServletContextListener)
_servletContextListeners.add((ServletContextListener)listener);

View File

@ -202,12 +202,4 @@ public class HandlerCollection extends AbstractHandlerContainer
child.destroy();
super.destroy();
}
/* ------------------------------------------------------------ */
@Override
public String toString()
{
Handler[] handlers=getHandlers();
return super.toString()+(handlers==null?"[]":Arrays.asList(handlers).toString());
}
}

View File

@ -32,6 +32,7 @@ import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.util.IncludeExcludeSet;
import org.eclipse.jetty.util.InetAddressSet;
import org.eclipse.jetty.util.component.DumpableCollection;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -137,6 +138,8 @@ public class InetAccessHandler extends HandlerWrapper
@Override
public void dump(Appendable out, String indent) throws IOException
{
dumpBeans(out, indent, _set.getIncluded(), _set.getExcluded());
dumpBeans(out, indent,
DumpableCollection.from("included",_set.getIncluded()),
DumpableCollection.from("excluded",_set.getExcluded()));
}
}

View File

@ -48,8 +48,8 @@ public class ClassLoaderDumptTest
StringBuilder out = new StringBuilder();
server.dump(out);
String dump = out.toString();
assertThat(dump,containsString("+- SimpleLoader"));
assertThat(dump,containsString("+> "+Server.class.getClassLoader()));
assertThat(dump,containsString("+-SimpleLoader"));
assertThat(dump,containsString("+>"+Server.class.getClassLoader()));
}
@Test
@ -69,9 +69,9 @@ public class ClassLoaderDumptTest
StringBuilder out = new StringBuilder();
server.dump(out);
String dump = out.toString();
assertThat(dump,containsString("+- ParentedLoader"));
assertThat(dump,containsString("| +- "+Server.class.getClassLoader()));
assertThat(dump,containsString("+> "+Server.class.getClassLoader()));
assertThat(dump,containsString("+-ParentedLoader"));
assertThat(dump,containsString("| +>"+Server.class.getClassLoader()));
assertThat(dump,containsString("+>"+Server.class.getClassLoader()));
}
@Test
@ -98,10 +98,10 @@ public class ClassLoaderDumptTest
StringBuilder out = new StringBuilder();
server.dump(out);
String dump = out.toString();
assertThat(dump,containsString("+- TopLoader"));
assertThat(dump,containsString("| +- MiddleLoader"));
assertThat(dump,containsString("| +- "+Server.class.getClassLoader()));
assertThat(dump,containsString("+> "+Server.class.getClassLoader()));
assertThat(dump,containsString("+-TopLoader"));
assertThat(dump,containsString("| +>MiddleLoader"));
assertThat(dump,containsString("| +>"+Server.class.getClassLoader()));
assertThat(dump,containsString("+>"+Server.class.getClassLoader()));
}
@Test
@ -122,10 +122,10 @@ public class ClassLoaderDumptTest
StringBuilder out = new StringBuilder();
server.dump(out);
String dump = out.toString();
assertThat(dump,containsString("+- TopLoader"));
assertThat(dump,containsString("| +- DumpableClassLoader"));
assertThat(dump,not(containsString("| +- "+Server.class.getClassLoader())));
assertThat(dump,containsString("+> "+Server.class.getClassLoader()));
assertThat(dump,containsString("+-TopLoader"));
assertThat(dump,containsString("| +>DumpableClassLoader"));
assertThat(dump,not(containsString("| +>"+Server.class.getClassLoader())));
assertThat(dump,containsString("+>"+Server.class.getClassLoader()));
}
public static class DumpableClassLoader extends ClassLoader implements Dumpable
@ -184,15 +184,15 @@ public class ClassLoaderDumptTest
server.dump(out);
String dump = out.toString();
// System.err.println(dump);
assertThat(dump,containsString("+- TopLoader"));
assertThat(dump,containsString("| +- file:/ONE"));
assertThat(dump,containsString("| +- file:/TWO"));
assertThat(dump,containsString("| +- file:/THREE"));
assertThat(dump,containsString("| +- MiddleLoader"));
assertThat(dump,containsString("| +- file:/one"));
assertThat(dump,containsString("| +- file:/two"));
assertThat(dump,containsString("| +- file:/three"));
assertThat(dump,containsString("| +- "+Server.class.getClassLoader()));
assertThat(dump,containsString("+> "+Server.class.getClassLoader()));
assertThat(dump,containsString("+-TopLoader"));
assertThat(dump,containsString("| | +>file:/ONE"));
assertThat(dump,containsString("| | +>file:/TWO"));
assertThat(dump,containsString("| | +>file:/THREE"));
assertThat(dump,containsString("| +>MiddleLoader"));
assertThat(dump,containsString("| | +>file:/one"));
assertThat(dump,containsString("| | +>file:/two"));
assertThat(dump,containsString("| | +>file:/three"));
assertThat(dump,containsString("| +>"+Server.class.getClassLoader()));
assertThat(dump,containsString("+>"+Server.class.getClassLoader()));
}
}

View File

@ -18,6 +18,7 @@
package org.eclipse.jetty.server;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
@ -28,7 +29,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
@ -634,7 +634,7 @@ public class RequestTest
};
//Send a request with encoded form content
String request="GET / HTTP/1.1\r\n"+
String request="POST / HTTP/1.1\r\n"+
"Host: whatever\r\n"+
"Content-Type: application/x-www-form-urlencoded; charset=utf-8\n"+
"Content-Length: 10\n"+
@ -647,6 +647,34 @@ public class RequestTest
assertThat(responses,startsWith("HTTP/1.1 200"));
}
@Test
public void testEncodedNotParams() throws Exception
{
_handler._checker = new RequestTester()
{
@Override
public boolean check(HttpServletRequest request,HttpServletResponse response)
{
return request.getParameter("param")==null;
}
};
//Send a request with encoded form content
String request="POST / HTTP/1.1\r\n"+
"Host: whatever\r\n"+
"Content-Type: application/octet-stream\n"+
"Content-Length: 10\n"+
"Content-Encoding: gzip\n"+
"Connection: close\n"+
"\n"+
"0123456789\n";
String responses=_connector.getResponse(request);
assertThat(responses,startsWith("HTTP/1.1 200"));
}
@Test
public void testInvalidHostHeader() throws Exception
{
@ -1815,7 +1843,7 @@ public class RequestTest
((Request)request).setHandled(true);
if (request.getContentLength()>0
&& !MimeTypes.Type.FORM_ENCODED.asString().equals(request.getContentType())
&& !request.getContentType().startsWith(MimeTypes.Type.FORM_ENCODED.asString())
&& !request.getContentType().startsWith("multipart/form-data"))
_content=IO.toString(request.getInputStream());

View File

@ -18,6 +18,7 @@
package org.eclipse.jetty.server;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.greaterThan;
@ -26,15 +27,17 @@ import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.net.BindException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URI;
import java.net.URISyntaxException;
@ -296,11 +299,28 @@ public class ServerConnectorTest
server.stop();
assertThat(connector.getTransport(),Matchers.nullValue());
}
@Test
public void testBindToAddressWhichIsInUse() throws Exception
{
try (ServerSocket socket = new ServerSocket(0))
{
final int port = socket.getLocalPort();
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(port);
server.addConnector(connector);
HandlerList handlers = new HandlerList();
handlers.addHandler(new DefaultHandler());
server.setHandler(handlers);
IOException x = assertThrows(IOException.class, () -> server.start());
assertThat(x.getCause(), instanceOf(BindException.class));
assertThat(x.getMessage(), containsString("0.0.0.0:" + port));
}
}
}

View File

@ -27,7 +27,6 @@ import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.util.Loader;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -194,14 +193,13 @@ public abstract class BaseHolder<T> extends AbstractLifeCycle implements Dumpabl
@Override
public void dump(Appendable out, String indent) throws IOException
{
out.append(toString())
.append(" - ").append(AbstractLifeCycle.getState(this)).append("\n");
Dumpable.dumpObject(out, this);
}
/* ------------------------------------------------------------ */
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
}

View File

@ -34,10 +34,11 @@ import javax.servlet.ServletException;
import org.eclipse.jetty.util.TypeUtil;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.component.DumpableCollection;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
public class FilterHolder extends Holder<Filter>
public class FilterHolder extends Holder<Filter>
{
private static final Logger LOG = Log.getLogger(FilterHolder.class);
@ -101,10 +102,6 @@ public class FilterHolder extends Holder<Filter>
}
/* ------------------------------------------------------------ */
@Override
public void initialize() throws Exception
@ -197,19 +194,22 @@ public class FilterHolder extends Holder<Filter>
/* ------------------------------------------------------------ */
@Override
public String toString()
public void dump(Appendable out, String indent) throws IOException
{
return getName();
if (_initParams.isEmpty())
Dumpable.dumpObjects(out, indent, this,
_filter == null?getHeldClass():_filter);
else
Dumpable.dumpObjects(out, indent, this,
_filter == null?getHeldClass():_filter,
new DumpableCollection("initParams", _initParams.entrySet()));
}
/* ------------------------------------------------------------ */
@Override
public void dump(Appendable out, String indent) throws IOException
public String toString()
{
super.dump(out, indent);
if(_filter instanceof Dumpable) {
((Dumpable) _filter).dump(out, indent);
}
return String.format("%s@%x==%s,inst=%b,async=%b",_name,hashCode(),_className,_filter!=null,isAsyncSupported());
}
/* ------------------------------------------------------------ */

View File

@ -29,7 +29,6 @@ import org.eclipse.jetty.http.PathMap;
import org.eclipse.jetty.util.TypeUtil;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
@ManagedObject("Filter Mappings")
@ -334,6 +333,6 @@ public class FilterMapping implements Dumpable
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
}

View File

@ -32,6 +32,7 @@ import javax.servlet.ServletContext;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.DumpableCollection;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -45,7 +46,7 @@ import org.eclipse.jetty.util.log.Logger;
* @param <T> the type of holder
*/
@ManagedObject("Holder - a container for servlets and the like")
public class Holder<T> extends BaseHolder<T>
public abstract class Holder<T> extends BaseHolder<T>
{
private static final Logger LOG = Log.getLogger(Holder.class);
@ -188,15 +189,6 @@ public class Holder<T> extends BaseHolder<T>
return _asyncSupported;
}
/* ------------------------------------------------------------ */
@Override
public void dump(Appendable out, String indent) throws IOException
{
super.dump(out,indent);
ContainerLifeCycle.dump(out,indent,_initParams.entrySet());
}
/* ------------------------------------------------------------ */
@Override
public String dump()

View File

@ -71,7 +71,6 @@ public class ListenerHolder extends BaseHolder<EventListener>
_listener = listener;
_extInstance=true;
setHeldClass(_listener.getClass());
setClassName(_listener.getClass().getName());
}

View File

@ -138,11 +138,11 @@ public class ServletHandler extends ScopedHandler
public void dump(Appendable out, String indent) throws IOException
{
dumpBeans(out,indent,
Collections.singletonList(new DumpableCollection("listeners "+this,_listeners)),
Collections.singletonList(new DumpableCollection("filters "+this,_filters)),
Collections.singletonList(new DumpableCollection("filterMappings "+this,_filterMappings)),
Collections.singletonList(new DumpableCollection("servlets "+this,_servlets)),
Collections.singletonList(new DumpableCollection("servletMappings "+this,_servletMappings)));
DumpableCollection.fromArray("listeners "+this,_listeners),
DumpableCollection.fromArray("filters "+this,_filters),
DumpableCollection.fromArray("filterMappings "+this,_filterMappings),
DumpableCollection.fromArray("servlets "+this,_servlets),
DumpableCollection.fromArray("servletMappings "+this,_servletMappings));
}
/* ----------------------------------------------------------------- */

View File

@ -55,6 +55,8 @@ import org.eclipse.jetty.util.Loader;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.component.DumpableCollection;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -1312,11 +1314,23 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
}
}
/* ------------------------------------------------------------ */
@Override
public void dump(Appendable out, String indent) throws IOException
{
if (_initParams.isEmpty())
Dumpable.dumpObjects(out, indent, this,
_servlet == null?getHeldClass():_servlet);
else
Dumpable.dumpObjects(out, indent, this,
_servlet == null?getHeldClass():_servlet,
new DumpableCollection("initParams", _initParams.entrySet()));
}
/* ------------------------------------------------------------ */
@Override
public String toString()
{
return String.format("%s@%x==%s,jsp=%s,order=%d,inst=%b",_name,hashCode(),_className,_forcedPath,_initOrder,_servlet!=null);
return String.format("%s@%x==%s,jsp=%s,order=%d,inst=%b,async=%b",_name,hashCode(),_className,_forcedPath,_initOrder,_servlet!=null,isAsyncSupported());
}
}

View File

@ -68,7 +68,7 @@ public class StartArgs
{
ver = ManifestUtils.getManifest(StartArgs.class)
.map(Manifest::getMainAttributes)
.filter(attributes -> "Eclipse.org - Jetty".equals(attributes.getValue("Implementation-Vendor")))
.filter(attributes -> "Eclipse Jetty Project".equals(attributes.getValue("Implementation-Vendor")))
.map(attributes -> attributes.getValue("Implementation-Version"))
.orElse(null);
}

View File

@ -18,6 +18,9 @@
package org.eclipse.jetty.util;
import org.eclipse.jetty.util.component.Dumpable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
@ -28,7 +31,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReference;
public class AttributesMap implements Attributes
public class AttributesMap implements Attributes, Dumpable
{
private final AtomicReference<ConcurrentMap<String, Object>> _map = new AtomicReference<>();
@ -148,4 +151,16 @@ public class AttributesMap implements Attributes
setAttribute(name, attributes.getAttribute(name));
}
}
@Override
public String dump()
{
return Dumpable.dump(this);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
Dumpable.dumpObjects(out,indent,String.format("%s@%x",this.getClass().getSimpleName(),hashCode()),map());
}
}

View File

@ -66,7 +66,7 @@ public class Jetty
Package pkg = Jetty.class.getPackage();
if (pkg != null &&
"Eclipse.org - Jetty".equals(pkg.getImplementationVendor()) &&
"Eclipse Jetty Project".equals(pkg.getImplementationVendor()) &&
pkg.getImplementationVersion() != null)
VERSION = pkg.getImplementationVersion();
else

View File

@ -230,6 +230,30 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
return false;
}
/**
* @param bean the bean to test
* @return whether this aggregate contains the bean in auto state
*/
public boolean isAuto(Object bean)
{
for (Bean b : _beans)
if (b._bean == bean)
return b._managed==Managed.AUTO;
return false;
}
/**
* @param bean the bean to test
* @return whether this aggregate contains the bean in auto state
*/
public boolean isUnmanaged(Object bean)
{
for (Bean b : _beans)
if (b._bean == bean)
return b._managed==Managed.UNMANAGED;
return false;
}
/**
* Adds the given bean, detecting whether to manage it or not.
* If the bean is a {@link LifeCycle}, then it will be managed if it is not
@ -616,6 +640,7 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
try
{
dump(System.err, "");
System.err.println(Dumpable.KEY);
}
catch (IOException e)
{
@ -627,46 +652,7 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
@ManagedOperation("Dump the object to a string")
public String dump()
{
return dump(this);
}
public static String dump(Dumpable dumpable)
{
StringBuilder b = new StringBuilder();
try
{
dumpable.dump(b, "");
}
catch (IOException e)
{
LOG.warn(e);
}
return b.toString();
}
public void dump(Appendable out) throws IOException
{
dump(out, "");
}
protected void dumpThis(Appendable out) throws IOException
{
out.append(String.valueOf(this)).append(" - ").append(getState()).append("\n");
}
public static void dumpObject(Appendable out, Object o) throws IOException
{
try
{
if (o instanceof LifeCycle)
out.append(String.valueOf(o)).append(" - ").append((AbstractLifeCycle.getState((LifeCycle)o))).append("\n");
else
out.append(String.valueOf(o)).append("\n");
}
catch (Throwable th)
{
out.append(" => ").append(th.toString()).append('\n');
}
return Dumpable.dump(this);
}
@Override
@ -675,63 +661,41 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
dumpBeans(out,indent);
}
protected void dumpBeans(Appendable out, String indent, Collection<?>... collections) throws IOException
/**
* Dump this object to an Appendable with no indent.
* @param out The appendable to dump to.
* @throws IOException May be thrown by the Appendable
*/
public void dump(Appendable out) throws IOException
{
dumpThis(out);
int size = _beans.size();
for (Collection<?> c : collections)
size += c.size();
int i = 0;
for (Bean b : _beans)
{
++i;
switch(b._managed)
{
case POJO:
out.append(indent).append(" +- ");
if (b._bean instanceof Dumpable)
((Dumpable)b._bean).dump(out, indent + (i == size ? " " : " | "));
else
dumpObject(out, b._bean);
break;
case MANAGED:
out.append(indent).append(" += ");
if (b._bean instanceof Dumpable)
((Dumpable)b._bean).dump(out, indent + (i == size ? " " : " | "));
else
dumpObject(out, b._bean);
break;
case UNMANAGED:
out.append(indent).append(" +~ ");
dumpObject(out, b._bean);
break;
case AUTO:
out.append(indent).append(" +? ");
if (b._bean instanceof Dumpable)
((Dumpable)b._bean).dump(out, indent + (i == size ? " " : " | "));
else
dumpObject(out, b._bean);
break;
}
}
for (Collection<?> c : collections)
{
for (Object o : c)
{
i++;
out.append(indent).append(" +> ");
if (o instanceof Dumpable)
((Dumpable)o).dump(out, indent + (i == size ? " " : " | "));
else
dumpObject(out, o);
}
}
dump(out, "");
}
/**
* Dump just this object, but not it's children. Typically used to
* implement {@link #dump(Appendable, String)}
* @param out The appendable to dump to
* @throws IOException May be thrown by the Appendable
*/
@Deprecated
protected void dumpThis(Appendable out) throws IOException
{
out.append(String.valueOf(this)).append(" - ").append(getState()).append("\n");
}
/** Dump this object, it's contained beans and additional items to an Appendable
* @param out The appendable to dump to
* @param indent The indent to apply after any new lines
* @param items Additional items to be dumped as contained.
* @throws IOException May be thrown by the Appendable
*/
protected void dumpBeans(Appendable out, String indent, Object... items) throws IOException
{
Dumpable.dumpObjects(out,indent,this, items);
}
@Deprecated
public static void dump(Appendable out, String indent, Collection<?>... collections) throws IOException
{
if (collections.length == 0)
@ -749,11 +713,7 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
{
i++;
out.append(indent).append(" +- ");
if (o instanceof Dumpable)
((Dumpable)o).dump(out, indent + (i == size ? " " : " | "));
else
dumpObject(out, o);
Dumpable.dumpObjects(out,indent + (i<size ? " | " : " "), o);
}
}
}

View File

@ -19,6 +19,13 @@
package org.eclipse.jetty.util.component;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.annotation.ManagedOperation;
@ -26,8 +33,189 @@ import org.eclipse.jetty.util.annotation.ManagedOperation;
@ManagedObject("Dumpable Object")
public interface Dumpable
{
@ManagedOperation(value="Dump the nested Object state as a String", impact="INFO")
String dump();
String KEY = "key: +- bean, += managed, +~ unmanaged, +? auto, +: iterable, +] array, +@ map, +> undefined";
@ManagedOperation(value="Dump the nested Object state as a String", impact="INFO")
default String dump()
{
return dump(this);
}
/**
* Dump this object (and children) into an Appendable using the provided indent after any new lines.
* The indent should not be applied to the first object dumped.
* @param out The appendable to dump to
* @param indent The indent to apply after any new lines.
* @throws IOException
*/
void dump(Appendable out,String indent) throws IOException;
/**
* Utility method to implement {@link #dump()} by calling {@link #dump(Appendable, String)}
* @param dumpable The dumpable to dump
* @return The dumped string
*/
static String dump(Dumpable dumpable)
{
StringBuilder b = new StringBuilder();
try
{
dumpable.dump(b, "");
}
catch (IOException e)
{
b.append(e.toString());
}
b.append(KEY);
return b.toString();
}
/**
* Dump just an Object (but not it's contained items) to an Appendable.
* @param out The Appendable to dump to
* @param o The object to dump.
* @throws IOException May be thrown by the Appendable
*/
static void dumpObject(Appendable out, Object o) throws IOException
{
try
{
String s;
if (o==null)
s = "null";
else if (o instanceof Collection)
s = String.format("%s@%x(size=%d)",o.getClass().getName(),o.hashCode(),((Collection)o).size());
else if (o.getClass().isArray())
s = String.format("%s@%x[size=%d]",o.getClass().getComponentType(),o.hashCode(), Array.getLength(o));
else if (o instanceof Map)
s = String.format("%s@%x{size=%d}",o.getClass().getName(),o.hashCode(),((Map<?,?>)o).size());
else
s = String.valueOf(o).replace("\r\n","|").replace("\n","|");
if (o instanceof LifeCycle)
out.append(s).append(" - ").append((AbstractLifeCycle.getState((LifeCycle)o))).append("\n");
else
out.append(s).append("\n");
}
catch (Throwable th)
{
out.append("=>").append(th.toString()).append("\n");
}
}
/**
* Dump an Object, it's contained items and additional items to an {@link Appendable}.
* If the object in an {@link Iterable} or an {@link Array}, then its contained items
* are also dumped.
* @param out the Appendable to dump to
* @param indent The indent to apply after any new lines
* @param object The object to dump. If the object is an instance
* of {@link Container}, {@link Stream}, {@link Iterable}, {@link Array} or {@link Map},
* then children of the object a recursively dumped.
* @param extraChildren Items to be dumped as children of the object, in addition to any discovered children of object
* @throws IOException May be thrown by the Appendable
*/
static void dumpObjects(Appendable out, String indent, Object object, Object... extraChildren) throws IOException
{
dumpObject(out,object);
int size = extraChildren==null?0:extraChildren.length;
if (object instanceof Stream)
object = ((Stream)object).toArray();
if (object instanceof Array)
object = Arrays.asList((Object[])object);
if (object instanceof Container)
{
Container container = (Container)object;
ContainerLifeCycle containerLifeCycle = container instanceof ContainerLifeCycle ? (ContainerLifeCycle)container : null;
for (Iterator<Object> i = container.getBeans().iterator(); i.hasNext();)
{
Object bean = i.next();
String nextIndent = indent + ((i.hasNext() || size>0) ? "| " : " ");
if (bean instanceof LifeCycle)
{
if (container.isManaged(bean))
{
out.append(indent).append("+=");
if (bean instanceof Dumpable)
((Dumpable)bean).dump(out,nextIndent);
else
dumpObjects(out, nextIndent, bean);
}
else if (containerLifeCycle != null && containerLifeCycle.isAuto(bean))
{
out.append(indent).append("+?");
if (bean instanceof Dumpable)
((Dumpable)bean).dump(out,nextIndent);
else
dumpObjects(out, nextIndent, bean);
}
else
{
out.append(indent).append("+~");
dumpObject(out, bean);
}
}
else if (containerLifeCycle != null && containerLifeCycle.isUnmanaged(bean))
{
out.append(indent).append("+~");
dumpObject(out, bean);
}
else
{
out.append(indent).append("+-");
if (bean instanceof Dumpable)
((Dumpable)bean).dump(out,nextIndent);
else
dumpObjects(out, nextIndent, bean);
}
}
}
if (object instanceof Iterable)
{
for (Iterator i = ((Iterable<?>)object).iterator(); i.hasNext();)
{
Object item = i.next();
String nextIndent = indent + ((i.hasNext() || size>0) ? "| " : " ");
out.append(indent).append("+:");
if (item instanceof Dumpable)
((Dumpable)item).dump(out,nextIndent);
else
dumpObjects(out,nextIndent, item);
}
}
else if (object instanceof Map)
{
for (Iterator<? extends Map.Entry<?, ?>> i = ((Map<?,?>)object).entrySet().iterator(); i.hasNext();)
{
Map.Entry entry = i.next();
String nextIndent = indent + ((i.hasNext() || size>0) ? "| " : " ");
out.append(indent).append("+@").append(String.valueOf(entry.getKey())).append('=');
Object item = entry.getValue();
if (item instanceof Dumpable)
((Dumpable)item).dump(out,nextIndent);
else
dumpObjects(out,nextIndent, item);
}
}
if (size==0)
return;
int i = 0;
for (Object item : extraChildren)
{
i++;
String nextIndent = indent + (i<size ? "| " : " ");
out.append(indent).append("+>");
if (item instanceof Dumpable)
((Dumpable)item).dump(out,nextIndent);
else
dumpObjects(out, nextIndent, item);
}
}
}

View File

@ -34,22 +34,26 @@ public class DumpableCollection implements Dumpable
_collection=collection;
}
public DumpableCollection(String name,Object... items)
public static DumpableCollection fromArray(String name, Object[] array)
{
this(name, items==null?Collections.emptyList():Arrays.asList(items));
return new DumpableCollection(name,array==null?Collections.emptyList():Arrays.asList(array));
}
public static DumpableCollection from(String name, Object... items)
{
return new DumpableCollection(name,items==null?Collections.emptyList():Arrays.asList(items));
}
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
out.append(_name).append(System.lineSeparator());
if (_collection!=null)
ContainerLifeCycle.dump(out,indent,_collection);
Object[] array = _collection.toArray();
Dumpable.dumpObjects(out,indent,_name + " size="+array.length, array);
}
}

View File

@ -76,7 +76,6 @@ import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -355,18 +354,26 @@ public class SslContextFactory extends AbstractLifeCycle implements Dumpable
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
out.append(String.valueOf(this)).append(" trustAll=").append(Boolean.toString(_trustAll)).append(System.lineSeparator());
try
{
List<SslSelectionDump> selections = selectionDump();
ContainerLifeCycle.dump(out, indent, selections);
SSLEngine sslEngine = SSLContext.getDefault().createSSLEngine();
Dumpable.dumpObjects(out, indent, this, "trustAll=" + _trustAll,
new SslSelectionDump("Protocol",
sslEngine.getSupportedProtocols(),
sslEngine.getEnabledProtocols(),
getExcludeProtocols(),
getIncludeProtocols()),
new SslSelectionDump("Cipher Suite",
sslEngine.getSupportedCipherSuites(),
sslEngine.getEnabledCipherSuites(),
getExcludeCipherSuites(),
getIncludeCipherSuites()));
}
catch (NoSuchAlgorithmException ignore)
{

View File

@ -44,16 +44,14 @@ class SslSelectionDump extends ContainerLifeCycle implements Dumpable
@Override
public String dump()
{
return ContainerLifeCycle.dump(SslSelectionDump.CaptionedList.this);
return Dumpable.dump(SslSelectionDump.CaptionedList.this);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
out.append(caption);
out.append(" (size=").append(Integer.toString(size())).append(")");
out.append(System.lineSeparator());
ContainerLifeCycle.dump(out, indent, this);
Object[] array = toArray();
Dumpable.dumpObjects(out, indent, caption + " size="+array.length, array);
}
}
@ -161,7 +159,7 @@ class SslSelectionDump extends ContainerLifeCycle implements Dumpable
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override

View File

@ -20,7 +20,6 @@ package org.eclipse.jetty.util.thread;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
@ -353,23 +352,27 @@ public class ExecutorThreadPool extends ContainerLifeCycle implements ThreadPool
@Override
public void dump(Appendable out, String indent) throws IOException
{
out.append(String.valueOf(thread.getId()))
StringBuilder b = new StringBuilder();
b.append(String.valueOf(thread.getId()))
.append(" ")
.append(thread.getName())
.append(" p=").append(String.valueOf(thread.getPriority()))
.append(" ")
.append(known)
.append(thread.getState().toString());
if (isDetailedDump())
{
out.append(System.lineSeparator());
if (known.isEmpty())
ContainerLifeCycle.dump(out, indent, Arrays.asList(frames));
Dumpable.dumpObjects(out, indent, b.toString(), (Object[])frames);
else
Dumpable.dumpObject(out, b.toString());
}
else
{
out.append(" @ ").append(frames.length > 0 ? String.valueOf(frames[0]) : "<no_stack_frames>")
.append(System.lineSeparator());
b.append(" @ ").append(frames.length > 0 ? String.valueOf(frames[0]) : "<no_stack_frames>");
Dumpable.dumpObject(out, b.toString());
}
}
@ -385,7 +388,7 @@ public class ExecutorThreadPool extends ContainerLifeCycle implements ThreadPool
List<Runnable> jobs = Collections.emptyList();
if (isDetailedDump())
jobs = new ArrayList<>(_executor.getQueue());
dumpBeans(out, indent, threads, Collections.singletonList(new DumpableCollection("jobs - size=" + jobs.size(), jobs)));
dumpBeans(out, indent, threads, new DumpableCollection("jobs", jobs));
}
@Override

View File

@ -20,8 +20,6 @@ package org.eclipse.jetty.util.thread;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
@ -32,7 +30,6 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import org.eclipse.jetty.util.BlockingArrayQueue;
import org.eclipse.jetty.util.ProcessorUtils;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.annotation.ManagedOperation;
@ -606,12 +603,11 @@ public class QueuedThreadPool extends ContainerLifeCycle implements SizedThreadP
@Override
public void dump(Appendable out, String indent) throws IOException
{
out.append(String.valueOf(thread.getId())).append(' ').append(thread.getName()).append(' ').append(known).append(thread.getState().toString());
if (thread.getPriority()!=Thread.NORM_PRIORITY)
out.append(" prio=").append(String.valueOf(thread.getPriority()));
out.append(System.lineSeparator());
String s = thread.getId()+" "+thread.getName()+" "+thread.getState()+" "+thread.getPriority();
if (known.length()==0)
ContainerLifeCycle.dump(out, indent, Arrays.asList(trace));
Dumpable.dumpObjects(out, indent, s, (Object[])trace);
else
Dumpable.dumpObjects(out, indent, s);
}
@Override
@ -628,11 +624,15 @@ public class QueuedThreadPool extends ContainerLifeCycle implements SizedThreadP
}
}
List<Runnable> jobs = Collections.emptyList();
if (isDetailedDump())
jobs = new ArrayList<>(getQueue());
dumpBeans(out, indent, threads, Collections.singletonList(new DumpableCollection("jobs - size=" + jobs.size(), jobs)));
{
List<Runnable> jobs = new ArrayList<>(getQueue());
dumpBeans(out, indent, new DumpableCollection("threads", threads), new DumpableCollection("jobs", jobs));
}
else
{
dumpBeans(out, indent, new DumpableCollection("threads", threads));
}
}
@Override

View File

@ -19,15 +19,12 @@
package org.eclipse.jetty.util.thread;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
/**
@ -109,19 +106,17 @@ public class ScheduledExecutorScheduler extends AbstractLifeCycle implements Sch
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
ContainerLifeCycle.dumpObject(out, this);
Thread thread = this.thread;
if (thread != null)
{
List<StackTraceElement> frames = Arrays.asList(thread.getStackTrace());
ContainerLifeCycle.dump(out, indent, frames);
}
if (thread == null)
Dumpable.dumpObject(out, this);
else
Dumpable.dumpObjects(out,indent,this, (Object[])thread.getStackTrace());
}
private static class ScheduledFutureTask implements Task

View File

@ -119,7 +119,7 @@ public class URIUtilCanonicalPathTest
ArrayList<Arguments> ret = new ArrayList<>();
for(String[] args: canonical)
{
ret.add(Arguments.of(args));
ret.add(Arguments.of((Object[])args));
}
return ret.stream();
}

View File

@ -215,59 +215,59 @@ public class ContainerLifeCycleTest
a0.addBean(aa0);
dump = trim(a0.dump());
dump = check(dump, "ContainerLifeCycl");
dump = check(dump, " +? ContainerLife");
dump = check(dump, "+?ContainerLife");
ContainerLifeCycle aa1 = new ContainerLifeCycle();
a0.addBean(aa1);
dump = trim(a0.dump());
dump = check(dump, "ContainerLifeCycl");
dump = check(dump, " +? ContainerLife");
dump = check(dump, " +? ContainerLife");
dump = check(dump, "+?ContainerLife");
dump = check(dump, "+?ContainerLife");
dump = check(dump, "");
ContainerLifeCycle aa2 = new ContainerLifeCycle();
a0.addBean(aa2, false);
dump = trim(a0.dump());
dump = check(dump, "ContainerLifeCycl");
dump = check(dump, " +? ContainerLife");
dump = check(dump, " +? ContainerLife");
dump = check(dump, " +~ ContainerLife");
dump = check(dump, "+?ContainerLife");
dump = check(dump, "+?ContainerLife");
dump = check(dump, "+~ContainerLife");
dump = check(dump, "");
aa1.start();
a0.start();
dump = trim(a0.dump());
dump = check(dump, "ContainerLifeCycl");
dump = check(dump, " += ContainerLife");
dump = check(dump, " +~ ContainerLife");
dump = check(dump, " +~ ContainerLife");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "+~ContainerLife");
dump = check(dump, "+~ContainerLife");
dump = check(dump, "");
a0.manage(aa1);
a0.removeBean(aa2);
dump = trim(a0.dump());
dump = check(dump, "ContainerLifeCycl");
dump = check(dump, " += ContainerLife");
dump = check(dump, " += ContainerLife");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "");
ContainerLifeCycle aaa0 = new ContainerLifeCycle();
aa0.addBean(aaa0);
dump = trim(a0.dump());
dump = check(dump, "ContainerLifeCycl");
dump = check(dump, " += ContainerLife");
dump = check(dump, " | +~ Container");
dump = check(dump, " += ContainerLife");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "| +~Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "");
ContainerLifeCycle aa10 = new ContainerLifeCycle();
aa1.addBean(aa10, true);
dump = trim(a0.dump());
dump = check(dump, "ContainerLifeCycl");
dump = check(dump, " += ContainerLife");
dump = check(dump, " | +~ Container");
dump = check(dump, " += ContainerLife");
dump = check(dump, " += Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "| +~Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, " +=Container");
dump = check(dump, "");
final ContainerLifeCycle a1 = new ContainerLifeCycle();
@ -280,63 +280,70 @@ public class ContainerLifeCycleTest
@Override
public void dump(Appendable out, String indent) throws IOException
{
out.append(this.toString()).append("\n");
dump(out, indent, TypeUtil.asList(new Object[]{a1, a2}), TypeUtil.asList(new Object[]{a3, a4}));
Dumpable.dumpObjects(out, indent, this.toString(), TypeUtil.asList(new Object[]{a1, a2}), TypeUtil.asList(new Object[]{a3, a4}));
}
};
a0.addBean(aa, true);
dump = trim(a0.dump());
dump = check(dump, "ContainerLifeCycl");
dump = check(dump, " += ContainerLife");
dump = check(dump, " | +~ Container");
dump = check(dump, " += ContainerLife");
dump = check(dump, " | += Container");
dump = check(dump, " += ContainerLife");
dump = check(dump, " +- Container");
dump = check(dump, " +- Container");
dump = check(dump, " +- Container");
dump = check(dump, " +- Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "| +~Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "| +=Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, " +>java.util.Arrays$ArrayList");
dump = check(dump, " | +:ContainerLifeCycle");
dump = check(dump, " | +:ContainerLifeCycle");
dump = check(dump, " +>java.util.Arrays$ArrayList");
dump = check(dump, " +:ContainerLifeCycle");
dump = check(dump, " +:ContainerLifeCycle");
dump = check(dump, "");
a2.addBean(aa0, true);
dump = trim(a0.dump());
dump = check(dump, "ContainerLifeCycl");
dump = check(dump, " += ContainerLife");
dump = check(dump, " | +~ Container");
dump = check(dump, " += ContainerLife");
dump = check(dump, " | += Container");
dump = check(dump, " += ContainerLife");
dump = check(dump, " +- Container");
dump = check(dump, " +- Container");
dump = check(dump, " | += Conta");
dump = check(dump, " | +~ C");
dump = check(dump, " +- Container");
dump = check(dump, " +- Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "| +~Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "| +=Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, " +>java.util.Arrays$ArrayList");
dump = check(dump, " | +:ContainerLifeCycle");
dump = check(dump, " | +:ContainerLifeCycle");
dump = check(dump, " | +=Conta");
dump = check(dump, " | +~C");
dump = check(dump, " +>java.util.Arrays$ArrayList");
dump = check(dump, " +:ContainerLifeCycle");
dump = check(dump, " +:ContainerLifeCycle");
dump = check(dump, "");
a2.unmanage(aa0);
dump = trim(a0.dump());
dump = check(dump, "ContainerLifeCycl");
dump = check(dump, " += ContainerLife");
dump = check(dump, " | +~ Container");
dump = check(dump, " += ContainerLife");
dump = check(dump, " | += Container");
dump = check(dump, " += ContainerLife");
dump = check(dump, " +- Container");
dump = check(dump, " +- Container");
dump = check(dump, " | +~ Conta");
dump = check(dump, " +- Container");
dump = check(dump, " +- Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "| +~Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "| +=Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, " +>java.util.Arrays$ArrayList");
dump = check(dump, " | +:ContainerLifeCycle");
dump = check(dump, " | +:ContainerLifeCycle");
dump = check(dump, " | +~Conta");
dump = check(dump, " +>java.util.Arrays$ArrayList");
dump = check(dump, " +:ContainerLifeCycle");
dump = check(dump, " +:ContainerLifeCycle");
dump = check(dump, "");
a0.unmanage(aa);
dump = trim(a0.dump());
dump = check(dump, "ContainerLifeCycl");
dump = check(dump, " += ContainerLife");
dump = check(dump, " | +~ Container");
dump = check(dump, " += ContainerLife");
dump = check(dump, " | += Container");
dump = check(dump, " +~ ContainerLife");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "| +~Container");
dump = check(dump, "+=ContainerLife");
dump = check(dump, "| +=Container");
dump = check(dump, "+~ContainerLife");
dump = check(dump, "");
}

View File

@ -1457,8 +1457,21 @@ public class FileSystemResourceTest
public void testUtf8Dir(Class resourceClass) throws Exception
{
Path dir = workDir.getEmptyPathDir();
Path utf8Dir = dir.resolve("bãm");
Files.createDirectories(utf8Dir);
Path utf8Dir;
try
{
utf8Dir = dir.resolve("bãm");
Files.createDirectories(utf8Dir);
}
catch (InvalidPathException e)
{
// if unable to create file, no point testing the rest.
// this is the path that occurs if you have a system that doesn't support UTF-8
// directory names (or you simply don't have a Locale set properly)
assumeTrue(true, "Not supported on this OS");
return;
}
Path file = utf8Dir.resolve("file.txt");
Files.createFile(file);

View File

@ -1068,13 +1068,13 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL
}
dumpBeans(out,indent,
Collections.singletonList(new ClassLoaderDump(getClassLoader())),
Collections.singletonList(new DumpableCollection("Systemclasses "+this,system_classes)),
Collections.singletonList(new DumpableCollection("Serverclasses "+this,server_classes)),
Collections.singletonList(new DumpableCollection("Configurations "+this,_configurations)),
Collections.singletonList(new DumpableCollection("Handler attributes "+this,((AttributesMap)getAttributes()).getAttributeEntrySet())),
Collections.singletonList(new DumpableCollection("Context attributes "+this,((Context)getServletContext()).getAttributeEntrySet())),
Collections.singletonList(new DumpableCollection("Initparams "+this,getInitParams().entrySet()))
new ClassLoaderDump(getClassLoader()),
new DumpableCollection("Systemclasses "+this,system_classes),
new DumpableCollection("Serverclasses "+this,server_classes),
new DumpableCollection("Configurations "+this,_configurations),
new DumpableCollection("Handler attributes "+this,((AttributesMap)getAttributes()).getAttributeEntrySet()),
new DumpableCollection("Context attributes "+this,((Context)getServletContext()).getAttributeEntrySet()),
new DumpableCollection("Initparams "+this,getInitParams().entrySet())
);
}

View File

@ -694,13 +694,6 @@ public class WebSocketClient extends ContainerLifeCycle implements WebSocketCont
getPolicy().setMaxTextMessageBufferSize(max);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
dumpThis(out);
dump(out,indent,getOpenSessions());
}
public HttpClient getHttpClient()
{
return this.httpClient;

View File

@ -21,6 +21,7 @@ package org.eclipse.jetty.websocket.common;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.URI;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@ -38,6 +39,7 @@ import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.component.DumpableCollection;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.ThreadClassLoaderScope;
@ -279,26 +281,9 @@ public class WebSocketSession extends ContainerLifeCycle implements Session, Rem
@Override
public void dump(Appendable out, String indent) throws IOException
{
dumpThis(out);
out.append(indent).append(" +- incomingHandler : ");
if (incomingHandler instanceof Dumpable)
{
((Dumpable)incomingHandler).dump(out,indent + " ");
}
else
{
out.append(incomingHandler.toString()).append(System.lineSeparator());
}
out.append(indent).append(" +- outgoingHandler : ");
if (outgoingHandler instanceof Dumpable)
{
((Dumpable)outgoingHandler).dump(out,indent + " ");
}
else
{
out.append(outgoingHandler.toString()).append(System.lineSeparator());
}
dumpBeans(out,indent,
DumpableCollection.from("incoming", incomingHandler),
DumpableCollection.from("outgoing", outgoingHandler));
}
@Override

View File

@ -24,7 +24,6 @@ import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -58,7 +57,7 @@ public abstract class AbstractExtension extends AbstractLifeCycle implements Dum
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override

View File

@ -33,7 +33,6 @@ import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -634,7 +633,7 @@ public abstract class AbstractWebSocketConnection extends AbstractConnection imp
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override

View File

@ -39,7 +39,6 @@ import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -275,14 +274,13 @@ public class WebSocketUpgradeFilter implements Filter, MappedWebSocketCreator, D
@Override
public String dump()
{
return ContainerLifeCycle.dump(this);
return Dumpable.dump(this);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
out.append(indent).append(" +- configuration=").append(configuration.toString()).append("\n");
configuration.dump(out, indent);
Dumpable.dumpObjects(out,indent,this,configuration);
}
public WebSocketServletFactory getFactory()

View File

@ -309,7 +309,7 @@
<Bundle-ManifestVersion>2</Bundle-ManifestVersion>
<Bundle-Name>${project.name}</Bundle-Name>
<Bundle-SymbolicName>${bundle-symbolic-name}.source</Bundle-SymbolicName>
<Bundle-Vendor>Eclipse.org - Jetty</Bundle-Vendor>
<Bundle-Vendor>Eclipse Jetty Project</Bundle-Vendor>
<Bundle-Version>${parsedVersion.osgiVersion}</Bundle-Version>
<Eclipse-SourceBundle>${bundle-symbolic-name};version="${parsedVersion.osgiVersion}";roots:="."</Eclipse-SourceBundle>
</manifestEntries>
@ -490,7 +490,7 @@
<manifestEntries>
<Automatic-Module-Name>${jpms-module-name}</Automatic-Module-Name>
<Implementation-Version>${project.version}</Implementation-Version>
<Implementation-Vendor>Eclipse.org - Jetty</Implementation-Vendor>
<Implementation-Vendor>Eclipse Jetty Project</Implementation-Vendor>
<url>${jetty.url}</url>
</manifestEntries>
</archive>
@ -529,7 +529,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.10.0</version>
<version>3.11.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -18,14 +18,6 @@
package org.eclipse.jetty;
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.security.HashLoginService;
import org.eclipse.jetty.server.ForwardedRequestCustomizer;
@ -44,8 +36,8 @@ import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.HandlerWrapper;
import org.eclipse.jetty.server.handler.RequestLogHandler;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.server.session.FileSessionDataStore;
import org.eclipse.jetty.server.session.DefaultSessionCache;
import org.eclipse.jetty.server.session.FileSessionDataStore;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.log.StdErrLog;
@ -53,6 +45,16 @@ import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import org.junit.jupiter.api.Disabled;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
@Disabled("Not a test case")
public class TestServer
{
@ -62,7 +64,12 @@ public class TestServer
{
((StdErrLog)Log.getLog()).setSource(false);
String jetty_root = "../../..";
// TODO don't depend on this file structure
Path jetty_root = FileSystems.getDefault().getPath(".").toAbsolutePath().normalize();
if (!Files.exists(jetty_root.resolve("VERSION.txt")))
jetty_root = FileSystems.getDefault().getPath("../../..").toAbsolutePath().normalize();
if (!Files.exists(jetty_root.resolve("VERSION.txt")))
throw new IllegalArgumentException(jetty_root.toString());
// Setup Threadpool
QueuedThreadPool threadPool = new QueuedThreadPool();
@ -112,7 +119,7 @@ public class TestServer
// Setup context
HashLoginService login = new HashLoginService();
login.setName("Test Realm");
login.setConfig(jetty_root + "/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/realm.properties");
login.setConfig(jetty_root.resolve("tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/realm.properties").toString());
server.addBean(login);
File log=File.createTempFile("jetty-yyyy_mm_dd", "log");
@ -125,7 +132,7 @@ public class TestServer
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/test");
webapp.setParentLoaderPriority(true);
webapp.setResourceBase("./src/main/webapp");
webapp.setResourceBase(jetty_root.resolve("tests/test-webapps/test-jetty-webapp/src/main/webapp").toString());
webapp.setAttribute("testAttribute","testValue");
File sessiondir=File.createTempFile("sessions",null);
if (sessiondir.exists())
@ -141,12 +148,13 @@ public class TestServer
contexts.addHandler(webapp);
ContextHandler srcroot = new ContextHandler();
srcroot.setResourceBase(".");
srcroot.setResourceBase(jetty_root.resolve("tests/test-webapps/test-jetty-webapp/src").toString());
srcroot.setHandler(new ResourceHandler());
srcroot.setContextPath("/src");
contexts.addHandler(srcroot);
server.start();
server.dumpStdErr();
server.join();
}