Cleanup the dump implementation (#2998)

* Cleanup the dump implementation
* improved the clarity of utility methods for dump and updated most dump methods
* fixed upgrade filter dump
* Improved dump after review
* Moved dumpObjects to Dumpable
* implemented dumpBeans with dumpObjects
* less verbose dump
* Dump streams
* fixed dump test

Signed-off-by: Greg Wilkins <gregw@webtide.com>
Signed-off-by: Simone Bordet <simone.bordet@gmail.com>
This commit is contained in:
Greg Wilkins 2018-10-22 11:53:59 +11:00 committed by GitHub
parent efdf3c2473
commit 15e1c73f9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
55 changed files with 584 additions and 431 deletions

View File

@ -128,7 +128,12 @@
<groupId>org.eclipse.jetty.orbit</groupId> <groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>javax.mail.glassfish</artifactId> <artifactId>javax.mail.glassfish</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId> <groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId> <artifactId>jetty-test-helper</artifactId>
<!-- scope>test</scope--> <!-- scope>test</scope-->

View File

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

View File

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

View File

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

View File

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

View File

@ -52,7 +52,7 @@ public class ServerWithAnnotations
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/"); webapp.setContextPath("/");
File warFile = new File( 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.setWar(warFile.getAbsolutePath());
webapp.setAttribute( webapp.setAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
@ -72,10 +72,11 @@ public class ServerWithAnnotations
// Configure a LoginService // Configure a LoginService
HashLoginService loginService = new HashLoginService(); HashLoginService loginService = new HashLoginService();
loginService.setName("Test Realm"); loginService.setName("Test Realm");
loginService.setConfig("src/test/resources/realm.properties"); loginService.setConfig("examples/embedded/src/test/resources/realm.properties");
server.addBean(loginService); server.addBean(loginService);
server.start(); server.start();
server.dumpStdErr();
server.join(); 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.Promise;
import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject; 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.Dumpable;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
@ -212,6 +211,6 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
@Override @Override
public String dump() 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.Callback;
import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject; 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.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.Sweeper; import org.eclipse.jetty.util.thread.Sweeper;
@ -239,20 +240,24 @@ public class DuplexConnectionPool extends AbstractConnectionPool implements Swee
@Override @Override
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
List<Connection> connections = new ArrayList<>(); DumpableCollection active;
DumpableCollection idle;
lock(); lock();
try try
{ {
connections.addAll(activeConnections); active = new DumpableCollection("active",new ArrayList<>(activeConnections));
connections.addAll(idleConnections); idle = new DumpableCollection("idle",new ArrayList<>(idleConnections));
} }
finally finally
{ {
unlock(); unlock();
} }
dump(out, indent, active, idle);
}
ContainerLifeCycle.dumpObject(out, this); protected void dump(Appendable out, String indent, Object... items) throws IOException
ContainerLifeCycle.dump(out, indent, connections); {
Dumpable.dumpObjects(out, indent, this, items);
} }
@Override @Override

View File

@ -472,8 +472,7 @@ public abstract class HttpDestination extends ContainerLifeCycle implements Dest
@Override @Override
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
super.dump(out, indent); dumpBeans(out, indent, new DumpableCollection("exchanges", exchanges));
ContainerLifeCycle.dump(out, indent, Collections.singleton(new DumpableCollection("exchanges", exchanges)));
} }
public String asString() 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.client.api.Connection;
import org.eclipse.jetty.util.Callback; 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.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.Sweeper; import org.eclipse.jetty.util.thread.Sweeper;
@ -310,21 +311,22 @@ public class MultiplexConnectionPool extends AbstractConnectionPool implements C
@Override @Override
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
List<Holder> connections = new ArrayList<>(); DumpableCollection busy;
DumpableCollection muxed;
DumpableCollection idle;
lock(); lock();
try try
{ {
connections.addAll(busyConnections.values()); busy = new DumpableCollection("busy", new ArrayList<>(busyConnections.values()));
connections.addAll(muxedConnections.values()); muxed = new DumpableCollection("muxed", new ArrayList<>(muxedConnections.values()));
connections.addAll(idleConnections); idle = new DumpableCollection("idle", new ArrayList<>(idleConnections));
} }
finally finally
{ {
unlock(); unlock();
} }
ContainerLifeCycle.dumpObject(out, this); Dumpable.dumpObjects(out, indent, this, busy, muxed, idle);
ContainerLifeCycle.dump(out, indent, connections);
} }
@Override @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.client.api.Destination;
import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.component.Dumpable;
@ManagedObject @ManagedObject
public class RoundRobinConnectionPool extends AbstractConnectionPool implements ConnectionPool.Multiplexable public class RoundRobinConnectionPool extends AbstractConnectionPool implements ConnectionPool.Multiplexable
@ -192,8 +192,7 @@ public class RoundRobinConnectionPool extends AbstractConnectionPool implements
{ {
connections = new ArrayList<>(entries); connections = new ArrayList<>(entries);
} }
ContainerLifeCycle.dumpObject(out, this); Dumpable.dumpObjects(out, indent, out, connections);
ContainerLifeCycle.dump(out, indent, connections);
} }
@Override @Override

View File

@ -23,12 +23,13 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Stream;
import org.eclipse.jetty.client.api.Connection; import org.eclipse.jetty.client.api.Connection;
import org.eclipse.jetty.client.api.Destination; import org.eclipse.jetty.client.api.Destination;
import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.annotation.ManagedAttribute; 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.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.Scheduler; import org.eclipse.jetty.util.thread.Scheduler;
@ -129,10 +130,10 @@ public class ValidatingConnectionPool extends DuplexConnectionPool
} }
@Override @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); DumpableCollection toDump = new DumpableCollection("quarantine", quarantine.values());
ContainerLifeCycle.dump(out, indent, quarantine.values()); super.dump(out, indent, Stream.concat(Stream.of(items), Stream.of(toDump)));
} }
@Override @Override

View File

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

View File

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

View File

@ -62,6 +62,7 @@ import org.eclipse.jetty.util.Retainable;
import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle; 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.component.DumpableCollection;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
@ -1205,8 +1206,7 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio
@Override @Override
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
super.dump(out, indent); Dumpable.dumpObjects(out, indent, this, new DumpableCollection("streams", streams.values()));
dump(out, indent, Collections.singleton(new DumpableCollection("streams", streams.values())));
} }
@Override @Override

View File

@ -42,7 +42,6 @@ import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
import org.eclipse.jetty.io.IdleTimeout; import org.eclipse.jetty.io.IdleTimeout;
import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.Promise; 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.component.Dumpable;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
@ -616,7 +615,7 @@ public class HTTP2Stream extends IdleTimeout implements IStream, Callback, Dumpa
@Override @Override
public String dump() public String dump()
{ {
return ContainerLifeCycle.dump(this); return Dumpable.dump(this);
} }
@Override @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.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.annotation.Name; 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.Dumpable;
import org.eclipse.jetty.util.component.LifeCycle; import org.eclipse.jetty.util.component.LifeCycle;
@ -288,14 +287,13 @@ public abstract class AbstractHTTP2ServerConnectionFactory extends AbstractConne
@Override @Override
public String dump() public String dump()
{ {
return ContainerLifeCycle.dump(this); return Dumpable.dump(this);
} }
@Override @Override
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
ContainerLifeCycle.dumpObject(out, this); Dumpable.dumpObjects(out,indent,this, sessions);
ContainerLifeCycle.dump(out, indent, sessions);
} }
@Override @Override

View File

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

View File

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

View File

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

View File

@ -486,13 +486,6 @@ public class ConnectHandler extends HandlerWrapper
return true; 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 class ConnectManager extends SelectorManager
{ {
protected ConnectManager(Executor executor, Scheduler scheduler, int selectors) protected ConnectManager(Executor executor, Scheduler scheduler, int selectors)

View File

@ -46,6 +46,7 @@ import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.server.UserIdentity; import org.eclipse.jetty.server.UserIdentity;
import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.util.URIUtil; 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.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.security.Constraint; import org.eclipse.jetty.util.security.Constraint;
@ -767,11 +768,11 @@ public class ConstraintSecurityHandler extends SecurityHandler implements Constr
{ {
// TODO these should all be beans // TODO these should all be beans
dumpBeans(out,indent, dumpBeans(out,indent,
Collections.singleton(getLoginService()), getLoginService(),
Collections.singleton(getIdentityService()), getIdentityService(),
Collections.singleton(getAuthenticator()), getAuthenticator(),
Collections.singleton(_roles), DumpableCollection.from("roles",_roles),
_constraintMap.entrySet()); DumpableCollection.from("constraints",_constraintMap.entrySet()));
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */

View File

@ -20,11 +20,9 @@ package org.eclipse.jetty.server;
import java.io.IOException; import java.io.IOException;
import java.net.URLClassLoader; 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.Dumpable;
import org.eclipse.jetty.util.component.DumpableCollection;
public class ClassLoaderDump implements Dumpable public class ClassLoaderDump implements Dumpable
{ {
@ -38,7 +36,7 @@ public class ClassLoaderDump implements Dumpable
@Override @Override
public String dump() public String dump()
{ {
return ContainerLifeCycle.dump(this); return Dumpable.dump(this);
} }
@Override @Override
@ -48,31 +46,34 @@ public class ClassLoaderDump implements Dumpable
out.append("No ClassLoader\n"); out.append("No ClassLoader\n");
else if (_loader instanceof Dumpable) else if (_loader instanceof Dumpable)
{ {
ContainerLifeCycle.dump(out,indent,Collections.singleton(_loader)); ((Dumpable)_loader).dump(out,indent);
} }
else if (_loader instanceof URLClassLoader) 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(); ClassLoader parent = _loader.getParent();
if (parent==null) if (parent==null)
ContainerLifeCycle.dump(out,indent,TypeUtil.asList(((URLClassLoader)_loader).getURLs())); Dumpable.dumpObjects(out,indent,loader,urls);
else if (parent == Server.class.getClassLoader()) 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) 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 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 else
{ {
out.append(String.valueOf(_loader)).append("\n"); String loader = _loader.toString();
ClassLoader parent = _loader.getParent(); ClassLoader parent = _loader.getParent();
if (parent==null)
Dumpable.dumpObject(out,loader);
if (parent==Server.class.getClassLoader()) 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) else if (parent instanceof Dumpable)
ContainerLifeCycle.dump(out,indent,Collections.singleton(parent)); Dumpable.dumpObjects(out,indent,loader,parent);
else if (parent!=null) 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; package org.eclipse.jetty.server;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; 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.annotation.ManagedOperation;
import org.eclipse.jetty.util.component.AbstractLifeCycle; import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.component.Container; 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.component.Dumpable;
import org.eclipse.jetty.util.statistic.CounterStatistic; import org.eclipse.jetty.util.statistic.CounterStatistic;
import org.eclipse.jetty.util.statistic.SampleStatistic; import org.eclipse.jetty.util.statistic.SampleStatistic;
@ -240,14 +238,17 @@ public class ConnectorStatistics extends AbstractLifeCycle implements Dumpable,
@ManagedOperation("dump thread state") @ManagedOperation("dump thread state")
public String dump() public String dump()
{ {
return ContainerLifeCycle.dump(this); return Dumpable.dump(this);
} }
@Override @Override
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
ContainerLifeCycle.dumpObject(out,this); Dumpable.dumpObjects(out,indent,this,
ContainerLifeCycle.dump(out,indent,Arrays.asList(new String[]{"connections="+_connectionStats,"duration="+_connectionDurationStats,"in="+_messagesIn,"out="+_messagesOut})); "connections="+_connectionStats,
"duration="+_connectionDurationStats,
"in="+_messagesIn,
"out="+_messagesOut);
} }
public static void addToAllConnectors(Server server) public static void addToAllConnectors(Server server)

View File

@ -628,6 +628,7 @@ public class Server extends HandlerWrapper implements Attributes
@Override @Override
public void setAttribute(String name, Object attribute) 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); Object old=_attributes.getAttribute(name);
updateBean(old,attribute); updateBean(old,attribute);
_attributes.setAttribute(name, attribute); _attributes.setAttribute(name, attribute);
@ -690,7 +691,7 @@ public class Server extends HandlerWrapper implements Attributes
@Override @Override
public void dump(Appendable out,String indent) throws IOException 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

@ -256,11 +256,12 @@ public class ContextHandler extends ScopedHandler implements Attributes, Gracefu
@Override @Override
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
dumpBeans(out,indent,Collections.singletonList(new ClassLoaderDump(getClassLoader())), dumpBeans(out, indent,
Collections.singletonList(new DumpableCollection("eventListeners "+this,_eventListeners)), new ClassLoaderDump(getClassLoader()),
Collections.singletonList(new DumpableCollection("handler attributes " + this,((AttributesMap)getAttributes()).getAttributeEntrySet())), new DumpableCollection("eventListeners " + this, _eventListeners),
Collections.singletonList(new DumpableCollection("context attributes " + this,((Context)getServletContext()).getAttributeEntrySet())), new DumpableCollection("handler attributes " + this, ((AttributesMap)getAttributes()).getAttributeEntrySet()),
Collections.singletonList(new DumpableCollection("initparams " + this,getInitParams().entrySet()))); new DumpableCollection("context attributes " + this, ((Context)getServletContext()).getAttributeEntrySet()),
new DumpableCollection("initparams " + this,getInitParams().entrySet()));
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */

View File

@ -202,12 +202,4 @@ public class HandlerCollection extends AbstractHandlerContainer
child.destroy(); child.destroy();
super.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.server.Request;
import org.eclipse.jetty.util.IncludeExcludeSet; import org.eclipse.jetty.util.IncludeExcludeSet;
import org.eclipse.jetty.util.InetAddressSet; 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.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
@ -137,6 +138,8 @@ public class InetAccessHandler extends HandlerWrapper
@Override @Override
public void dump(Appendable out, String indent) throws IOException 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(); StringBuilder out = new StringBuilder();
server.dump(out); server.dump(out);
String dump = out.toString(); String dump = out.toString();
assertThat(dump,containsString("+- SimpleLoader")); assertThat(dump,containsString("+-SimpleLoader"));
assertThat(dump,containsString("+> "+Server.class.getClassLoader())); assertThat(dump,containsString("+>"+Server.class.getClassLoader()));
} }
@Test @Test
@ -69,9 +69,9 @@ public class ClassLoaderDumptTest
StringBuilder out = new StringBuilder(); StringBuilder out = new StringBuilder();
server.dump(out); server.dump(out);
String dump = out.toString(); String dump = out.toString();
assertThat(dump,containsString("+- ParentedLoader")); assertThat(dump,containsString("+-ParentedLoader"));
assertThat(dump,containsString("| +- "+Server.class.getClassLoader())); assertThat(dump,containsString("| +>"+Server.class.getClassLoader()));
assertThat(dump,containsString("+> "+Server.class.getClassLoader())); assertThat(dump,containsString("+>"+Server.class.getClassLoader()));
} }
@Test @Test
@ -98,10 +98,10 @@ public class ClassLoaderDumptTest
StringBuilder out = new StringBuilder(); StringBuilder out = new StringBuilder();
server.dump(out); server.dump(out);
String dump = out.toString(); String dump = out.toString();
assertThat(dump,containsString("+- TopLoader")); assertThat(dump,containsString("+-TopLoader"));
assertThat(dump,containsString("| +- MiddleLoader")); assertThat(dump,containsString("| +>MiddleLoader"));
assertThat(dump,containsString("| +- "+Server.class.getClassLoader())); assertThat(dump,containsString("| +>"+Server.class.getClassLoader()));
assertThat(dump,containsString("+> "+Server.class.getClassLoader())); assertThat(dump,containsString("+>"+Server.class.getClassLoader()));
} }
@Test @Test
@ -122,10 +122,10 @@ public class ClassLoaderDumptTest
StringBuilder out = new StringBuilder(); StringBuilder out = new StringBuilder();
server.dump(out); server.dump(out);
String dump = out.toString(); String dump = out.toString();
assertThat(dump,containsString("+- TopLoader")); assertThat(dump,containsString("+-TopLoader"));
assertThat(dump,containsString("| +- DumpableClassLoader")); assertThat(dump,containsString("| +>DumpableClassLoader"));
assertThat(dump,not(containsString("| +- "+Server.class.getClassLoader()))); assertThat(dump,not(containsString("| +>"+Server.class.getClassLoader())));
assertThat(dump,containsString("+> "+Server.class.getClassLoader())); assertThat(dump,containsString("+>"+Server.class.getClassLoader()));
} }
public static class DumpableClassLoader extends ClassLoader implements Dumpable public static class DumpableClassLoader extends ClassLoader implements Dumpable
@ -184,15 +184,15 @@ public class ClassLoaderDumptTest
server.dump(out); server.dump(out);
String dump = out.toString(); String dump = out.toString();
// System.err.println(dump); // System.err.println(dump);
assertThat(dump,containsString("+- TopLoader")); assertThat(dump,containsString("+-TopLoader"));
assertThat(dump,containsString("| +- file:/ONE")); assertThat(dump,containsString("| | +>file:/ONE"));
assertThat(dump,containsString("| +- file:/TWO")); assertThat(dump,containsString("| | +>file:/TWO"));
assertThat(dump,containsString("| +- file:/THREE")); assertThat(dump,containsString("| | +>file:/THREE"));
assertThat(dump,containsString("| +- MiddleLoader")); assertThat(dump,containsString("| +>MiddleLoader"));
assertThat(dump,containsString("| +- file:/one")); assertThat(dump,containsString("| | +>file:/one"));
assertThat(dump,containsString("| +- file:/two")); assertThat(dump,containsString("| | +>file:/two"));
assertThat(dump,containsString("| +- file:/three")); assertThat(dump,containsString("| | +>file:/three"));
assertThat(dump,containsString("| +- "+Server.class.getClassLoader())); assertThat(dump,containsString("| +>"+Server.class.getClassLoader()));
assertThat(dump,containsString("+> "+Server.class.getClassLoader())); assertThat(dump,containsString("+>"+Server.class.getClassLoader()));
} }
} }

View File

@ -27,7 +27,6 @@ import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.util.Loader; import org.eclipse.jetty.util.Loader;
import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.component.AbstractLifeCycle; 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.component.Dumpable;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
@ -194,14 +193,13 @@ public abstract class BaseHolder<T> extends AbstractLifeCycle implements Dumpabl
@Override @Override
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
out.append(toString()) Dumpable.dumpObject(out, this);
.append(" - ").append(AbstractLifeCycle.getState(this)).append("\n");
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
@Override @Override
public String dump() 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.TypeUtil;
import org.eclipse.jetty.util.component.Dumpable; 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.Log;
import org.eclipse.jetty.util.log.Logger; 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); private static final Logger LOG = Log.getLogger(FilterHolder.class);
@ -101,10 +102,6 @@ public class FilterHolder extends Holder<Filter>
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
@Override @Override
public void initialize() throws Exception public void initialize() throws Exception
@ -197,19 +194,22 @@ public class FilterHolder extends Holder<Filter>
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
@Override @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 @Override
public void dump(Appendable out, String indent) throws IOException public String toString()
{ {
super.dump(out, indent); return String.format("%s@%x==%s,inst=%b,async=%b",_name,hashCode(),_className,_filter!=null,isAsyncSupported());
if(_filter instanceof Dumpable) {
((Dumpable) _filter).dump(out, indent);
}
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */

View File

@ -29,7 +29,6 @@ import org.eclipse.jetty.http.PathMap;
import org.eclipse.jetty.util.TypeUtil; import org.eclipse.jetty.util.TypeUtil;
import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject; 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.Dumpable;
@ManagedObject("Filter Mappings") @ManagedObject("Filter Mappings")
@ -334,6 +333,6 @@ public class FilterMapping implements Dumpable
@Override @Override
public String dump() 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.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle; 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.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
@ -45,7 +46,7 @@ import org.eclipse.jetty.util.log.Logger;
* @param <T> the type of holder * @param <T> the type of holder
*/ */
@ManagedObject("Holder - a container for servlets and the like") @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); private static final Logger LOG = Log.getLogger(Holder.class);
@ -188,15 +189,6 @@ public class Holder<T> extends BaseHolder<T>
return _asyncSupported; return _asyncSupported;
} }
/* ------------------------------------------------------------ */
@Override
public void dump(Appendable out, String indent) throws IOException
{
super.dump(out,indent);
ContainerLifeCycle.dump(out,indent,_initParams.entrySet());
}
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
@Override @Override
public String dump() public String dump()

View File

@ -138,11 +138,11 @@ public class ServletHandler extends ScopedHandler
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
dumpBeans(out,indent, dumpBeans(out,indent,
Collections.singletonList(new DumpableCollection("listeners "+this,_listeners)), DumpableCollection.fromArray("listeners "+this,_listeners),
Collections.singletonList(new DumpableCollection("filters "+this,_filters)), DumpableCollection.fromArray("filters "+this,_filters),
Collections.singletonList(new DumpableCollection("filterMappings "+this,_filterMappings)), DumpableCollection.fromArray("filterMappings "+this,_filterMappings),
Collections.singletonList(new DumpableCollection("servlets "+this,_servlets)), DumpableCollection.fromArray("servlets "+this,_servlets),
Collections.singletonList(new DumpableCollection("servletMappings "+this,_servletMappings))); 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.StringUtil;
import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject; 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.Log;
import org.eclipse.jetty.util.log.Logger; 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 @Override
public String toString() 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

@ -18,6 +18,9 @@
package org.eclipse.jetty.util; package org.eclipse.jetty.util;
import org.eclipse.jetty.util.component.Dumpable;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Enumeration; import java.util.Enumeration;
@ -28,7 +31,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReference; 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<>(); private final AtomicReference<ConcurrentMap<String, Object>> _map = new AtomicReference<>();
@ -148,4 +151,16 @@ public class AttributesMap implements Attributes
setAttribute(name, attributes.getAttribute(name)); 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

@ -230,6 +230,30 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
return false; 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. * 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 * 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 try
{ {
dump(System.err, ""); dump(System.err, "");
System.err.println(Dumpable.KEY);
} }
catch (IOException e) catch (IOException e)
{ {
@ -627,46 +652,7 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
@ManagedOperation("Dump the object to a string") @ManagedOperation("Dump the object to a string")
public String dump() public String dump()
{ {
return dump(this); return Dumpable.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');
}
} }
@Override @Override
@ -675,63 +661,41 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
dumpBeans(out,indent); 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); dump(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 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 public static void dump(Appendable out, String indent, Collection<?>... collections) throws IOException
{ {
if (collections.length == 0) if (collections.length == 0)
@ -749,11 +713,7 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
{ {
i++; i++;
out.append(indent).append(" +- "); out.append(indent).append(" +- ");
Dumpable.dumpObjects(out,indent + (i<size ? " | " : " "), o);
if (o instanceof Dumpable)
((Dumpable)o).dump(out, indent + (i == size ? " " : " | "));
else
dumpObject(out, o);
} }
} }
} }

View File

@ -19,6 +19,13 @@
package org.eclipse.jetty.util.component; package org.eclipse.jetty.util.component;
import java.io.IOException; 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.ManagedObject;
import org.eclipse.jetty.util.annotation.ManagedOperation; import org.eclipse.jetty.util.annotation.ManagedOperation;
@ -26,8 +33,189 @@ import org.eclipse.jetty.util.annotation.ManagedOperation;
@ManagedObject("Dumpable Object") @ManagedObject("Dumpable Object")
public interface Dumpable public interface Dumpable
{ {
@ManagedOperation(value="Dump the nested Object state as a String", impact="INFO") String KEY = "key: +- bean, += managed, +~ unmanaged, +? auto, +: iterable, +] array, +@ map, +> undefined";
String dump();
@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; 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; _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 @Override
public String dump() public String dump()
{ {
return ContainerLifeCycle.dump(this); return Dumpable.dump(this);
} }
@Override @Override
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
out.append(_name).append(System.lineSeparator()); Object[] array = _collection.toArray();
if (_collection!=null) Dumpable.dumpObjects(out,indent,_name + " size="+array.length, array);
ContainerLifeCycle.dump(out,indent,_collection);
} }
} }

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.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.AbstractLifeCycle; 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.component.Dumpable;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
@ -355,18 +354,26 @@ public class SslContextFactory extends AbstractLifeCycle implements Dumpable
@Override @Override
public String dump() public String dump()
{ {
return ContainerLifeCycle.dump(this); return Dumpable.dump(this);
} }
@Override @Override
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
out.append(String.valueOf(this)).append(" trustAll=").append(Boolean.toString(_trustAll)).append(System.lineSeparator());
try try
{ {
List<SslSelectionDump> selections = selectionDump(); SSLEngine sslEngine = SSLContext.getDefault().createSSLEngine();
ContainerLifeCycle.dump(out, indent, selections); 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) catch (NoSuchAlgorithmException ignore)
{ {

View File

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

View File

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

View File

@ -20,7 +20,6 @@ package org.eclipse.jetty.util.thread;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -32,7 +31,6 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import org.eclipse.jetty.util.BlockingArrayQueue; 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.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.annotation.ManagedOperation; import org.eclipse.jetty.util.annotation.ManagedOperation;
@ -606,12 +604,11 @@ public class QueuedThreadPool extends ContainerLifeCycle implements SizedThreadP
@Override @Override
public void dump(Appendable out, String indent) throws IOException 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()); String s = thread.getId()+" "+thread.getName()+" "+thread.getState()+" "+thread.getPriority();
if (thread.getPriority()!=Thread.NORM_PRIORITY)
out.append(" prio=").append(String.valueOf(thread.getPriority()));
out.append(System.lineSeparator());
if (known.length()==0) 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 @Override
@ -632,7 +629,7 @@ public class QueuedThreadPool extends ContainerLifeCycle implements SizedThreadP
if (isDetailedDump()) if (isDetailedDump())
jobs = new ArrayList<>(getQueue()); jobs = new ArrayList<>(getQueue());
dumpBeans(out, indent, threads, Collections.singletonList(new DumpableCollection("jobs - size=" + jobs.size(), jobs))); dumpBeans(out, indent, new DumpableCollection("threads",threads), new DumpableCollection("jobs", jobs));
} }
@Override @Override

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -21,6 +21,7 @@ package org.eclipse.jetty.websocket.common;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.URI; import java.net.URI;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; 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.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable; 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.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.ThreadClassLoaderScope; import org.eclipse.jetty.util.thread.ThreadClassLoaderScope;
@ -279,26 +281,9 @@ public class WebSocketSession extends ContainerLifeCycle implements Session, Rem
@Override @Override
public void dump(Appendable out, String indent) throws IOException public void dump(Appendable out, String indent) throws IOException
{ {
dumpThis(out); dumpBeans(out,indent,
out.append(indent).append(" +- incomingHandler : "); DumpableCollection.from("incoming", incomingHandler),
if (incomingHandler instanceof Dumpable) DumpableCollection.from("outgoing", outgoingHandler));
{
((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());
}
} }
@Override @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.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.AbstractLifeCycle; 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.component.Dumpable;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
@ -58,7 +57,7 @@ public abstract class AbstractExtension extends AbstractLifeCycle implements Dum
@Override @Override
public String dump() public String dump()
{ {
return ContainerLifeCycle.dump(this); return Dumpable.dump(this);
} }
@Override @Override

View File

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

View File

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

View File

@ -18,14 +18,6 @@
package org.eclipse.jetty; 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.jmx.MBeanContainer;
import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.HashLoginService;
import org.eclipse.jetty.server.ForwardedRequestCustomizer; 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.HandlerWrapper;
import org.eclipse.jetty.server.handler.RequestLogHandler; import org.eclipse.jetty.server.handler.RequestLogHandler;
import org.eclipse.jetty.server.handler.ResourceHandler; 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.DefaultSessionCache;
import org.eclipse.jetty.server.session.FileSessionDataStore;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.log.StdErrLog; 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.eclipse.jetty.webapp.WebAppContext;
import org.junit.jupiter.api.Disabled; 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") @Disabled("Not a test case")
public class TestServer public class TestServer
{ {
@ -62,7 +64,12 @@ public class TestServer
{ {
((StdErrLog)Log.getLog()).setSource(false); ((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 // Setup Threadpool
QueuedThreadPool threadPool = new QueuedThreadPool(); QueuedThreadPool threadPool = new QueuedThreadPool();
@ -112,7 +119,7 @@ public class TestServer
// Setup context // Setup context
HashLoginService login = new HashLoginService(); HashLoginService login = new HashLoginService();
login.setName("Test Realm"); 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); server.addBean(login);
File log=File.createTempFile("jetty-yyyy_mm_dd", "log"); File log=File.createTempFile("jetty-yyyy_mm_dd", "log");
@ -125,7 +132,7 @@ public class TestServer
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/test"); webapp.setContextPath("/test");
webapp.setParentLoaderPriority(true); 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"); webapp.setAttribute("testAttribute","testValue");
File sessiondir=File.createTempFile("sessions",null); File sessiondir=File.createTempFile("sessions",null);
if (sessiondir.exists()) if (sessiondir.exists())
@ -141,12 +148,13 @@ public class TestServer
contexts.addHandler(webapp); contexts.addHandler(webapp);
ContextHandler srcroot = new ContextHandler(); ContextHandler srcroot = new ContextHandler();
srcroot.setResourceBase("."); srcroot.setResourceBase(jetty_root.resolve("tests/test-webapps/test-jetty-webapp/src").toString());
srcroot.setHandler(new ResourceHandler()); srcroot.setHandler(new ResourceHandler());
srcroot.setContextPath("/src"); srcroot.setContextPath("/src");
contexts.addHandler(srcroot); contexts.addHandler(srcroot);
server.start(); server.start();
server.dumpStdErr();
server.join(); server.join();
} }