Merge branch 'jetty-9.4.x' into jetty-9.4.x-1027-SearchPattern

This commit is contained in:
Lachlan Roberts 2018-03-13 09:30:00 +11:00
commit 244db8c482
139 changed files with 1990 additions and 754 deletions

21
Jenkinsfile vendored
View File

@ -40,7 +40,7 @@ def getFullBuild(jdk, os) {
withMaven(
maven: 'maven3',
jdk: "$jdk",
options: disableMvnReporters(),
publisherStrategy: 'EXPLICIT',
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
sh "mvn -V -B clean install -Dtest=None -T6"
}
@ -61,7 +61,7 @@ def getFullBuild(jdk, os) {
withMaven(
maven: 'maven3',
jdk: "$jdk",
options: disableMvnReporters(),
publisherStrategy: 'EXPLICIT',
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
sh "mvn -V -B javadoc:javadoc -T5"
}
@ -82,7 +82,7 @@ def getFullBuild(jdk, os) {
withMaven(
maven: 'maven3',
jdk: "$jdk",
options: disableMvnReporters(),
publisherStrategy: 'EXPLICIT',
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
//
sh "mvn -V -B install -Dmaven.test.failure.ignore=true -Prun-its -T3 -e -Dmaven.repo.local=${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}"
@ -136,7 +136,7 @@ def getFullBuild(jdk, os) {
withMaven(
maven: 'maven3',
jdk: "$jdk",
options: disableMvnReporters(),
publisherStrategy: 'EXPLICIT',
mavenLocalRepo: "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}") {
sh "mvn -V -B -Pcompact3 clean install -T5"
}
@ -198,17 +198,4 @@ def notifyBuild(String buildStatus, String jdk)
)
}
def disableMvnReporters() {
return [
concordionPublisher(disabled: true),
dependenciesFingerprintPublisher(disabled: true),
findbugsPublisher(disabled: true),
artifactsPublisher(disabled: true),
invokerPublisher(disabled: true),
jgivenPublisher(disabled: true),
junitPublisher(disabled: true),
pipelineGraphPublisher(disabled: true),
openTasksPublisher(disabled: true)];
}
// vim: et:ts=2:sw=2:ft=groovy

View File

@ -47,6 +47,7 @@ import org.eclipse.jetty.annotations.AnnotationParser.Handler;
import org.eclipse.jetty.plus.annotation.ContainerInitializer;
import org.eclipse.jetty.util.JavaVersion;
import org.eclipse.jetty.util.MultiException;
import org.eclipse.jetty.util.ProcessorUtils;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.TypeUtil;
import org.eclipse.jetty.util.log.Log;
@ -453,7 +454,7 @@ public class AnnotationConfiguration extends AbstractConfiguration
start = System.nanoTime();
//execute scan, either effectively synchronously (1 thread only), or asynchronously (limited by number of processors available)
final Semaphore task_limit = (isUseMultiThreading(context)? new Semaphore(Runtime.getRuntime().availableProcessors()):new Semaphore(1));
final Semaphore task_limit = (isUseMultiThreading(context)? new Semaphore(ProcessorUtils.availableProcessors()):new Semaphore( 1));
final CountDownLatch latch = new CountDownLatch(_parserTasks.size());
final MultiException me = new MultiException();

View File

@ -20,10 +20,10 @@ package org.eclipse.jetty.client;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.jetty.client.api.Connection;
import org.eclipse.jetty.client.api.Destination;
import org.eclipse.jetty.util.AtomicBiInteger;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
@ -39,7 +39,12 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
private static final Logger LOG = Log.getLogger(AbstractConnectionPool.class);
private final AtomicBoolean closed = new AtomicBoolean();
private final AtomicInteger connectionCount = new AtomicInteger();
/**
* The connectionCount encodes both the total connections plus the pending connection counts, so both can be atomically changed.
* The bottom 32 bits represent the total connections and the top 32 bits represent the pending connections.
*/
private final AtomicBiInteger connections = new AtomicBiInteger();
private final Destination destination;
private final int maxConnections;
private final Callback requester;
@ -60,13 +65,19 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
@ManagedAttribute(value = "The number of connections", readonly = true)
public int getConnectionCount()
{
return connectionCount.get();
return connections.getLo();
}
@ManagedAttribute(value = "The number of pending connections", readonly = true)
public int getPendingCount()
{
return connections.getHi();
}
@Override
public boolean isEmpty()
{
return connectionCount.get() == 0;
return connections.getLo() == 0;
}
@Override
@ -80,29 +91,34 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
{
Connection connection = activate();
if (connection == null)
connection = tryCreate();
{
tryCreate(-1);
connection = activate();
}
return connection;
}
private Connection tryCreate()
protected void tryCreate(int maxPending)
{
while (true)
{
int current = getConnectionCount();
final int next = current + 1;
long encoded = connections.get();
int pending = AtomicBiInteger.getHi(encoded);
int total = AtomicBiInteger.getLo(encoded);
if (next > maxConnections)
if (LOG.isDebugEnabled())
LOG.debug("tryCreate {}/{} connections {}/{} pending",total,maxConnections,pending,maxPending);
if (total >= maxConnections)
return;
if (maxPending>=0 && pending>=maxPending)
return;
if (connections.compareAndSet(encoded,pending+1,total+1))
{
if (LOG.isDebugEnabled())
LOG.debug("Max connections {}/{} reached", current, maxConnections);
// Try again the idle connections
return activate();
}
if (connectionCount.compareAndSet(current, next))
{
if (LOG.isDebugEnabled())
LOG.debug("Connection {}/{} creation", next, maxConnections);
LOG.debug("newConnection {}/{} connections {}/{} pending", total+1, maxConnections, pending+1, maxPending);
destination.newConnection(new Promise<Connection>()
{
@ -110,7 +126,8 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
public void succeeded(Connection connection)
{
if (LOG.isDebugEnabled())
LOG.debug("Connection {}/{} creation succeeded {}", next, maxConnections, connection);
LOG.debug("Connection {}/{} creation succeeded {}", total+1, maxConnections, connection);
connections.update(-1,0);
onCreated(connection);
proceed();
}
@ -119,14 +136,13 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
public void failed(Throwable x)
{
if (LOG.isDebugEnabled())
LOG.debug("Connection " + next + "/" + maxConnections + " creation failed", x);
connectionCount.decrementAndGet();
LOG.debug("Connection " + (total+1) + "/" + maxConnections + " creation failed", x);
connections.update(-1,-1);
requester.failed(x);
}
});
// Try again the idle connections
return activate();
return;
}
}
}
@ -174,7 +190,7 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
protected void removed(Connection connection)
{
int pooled = connectionCount.decrementAndGet();
int pooled = connections.updateLo(-1);
if (LOG.isDebugEnabled())
LOG.debug("Connection removed {} - pooled: {}", connection, pooled);
}
@ -184,7 +200,7 @@ public abstract class AbstractConnectionPool implements ConnectionPool, Dumpable
{
if (closed.compareAndSet(false, true))
{
connectionCount.set(0);
connections.set(0,0);
}
}

View File

@ -88,20 +88,21 @@ public abstract class AbstractConnectorHttpClientTransport extends AbstractHttpC
context.put(SslClientConnectionFactory.SSL_PEER_HOST_CONTEXT_KEY, destination.getHost());
context.put(SslClientConnectionFactory.SSL_PEER_PORT_CONTEXT_KEY, destination.getPort());
boolean connected = true;
if (client.isConnectBlocking())
{
channel.socket().connect(address, (int)client.getConnectTimeout());
channel.configureBlocking(false);
selectorManager.accept(channel, context);
}
else
{
channel.configureBlocking(false);
if (channel.connect(address))
selectorManager.accept(channel, context);
else
selectorManager.connect(channel, context);
connected = channel.connect(address);
}
if (connected)
selectorManager.accept(channel, context);
else
selectorManager.connect(channel, context);
}
// Must catch all exceptions, since some like
// UnresolvedAddressException are not IOExceptions.

View File

@ -64,6 +64,7 @@ import org.eclipse.jetty.io.MappedByteBufferPool;
import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
import org.eclipse.jetty.util.Fields;
import org.eclipse.jetty.util.Jetty;
import org.eclipse.jetty.util.ProcessorUtils;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.SocketAddressResolver;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
@ -213,7 +214,7 @@ public class HttpClient extends ContainerLifeCycle
byteBufferPool = new MappedByteBufferPool(2048,
executor instanceof ThreadPool.SizedThreadPool
? ((ThreadPool.SizedThreadPool)executor).getMaxThreads()/2
: Runtime.getRuntime().availableProcessors()*2);
: ProcessorUtils.availableProcessors()*2);
addBean(byteBufferPool);
if (scheduler == null)

View File

@ -81,6 +81,17 @@ public class HttpContent implements Callback, Closeable
this.iterator = provider == null ? Collections.<ByteBuffer>emptyIterator() : provider.iterator();
}
/**
* @param buffer
* @return true if the buffer is the sentinel instance {@link CLOSE}
*/
private static boolean isTheCloseBuffer(ByteBuffer buffer)
{
@SuppressWarnings("ReferenceEquality")
boolean isTheCloseBuffer = (buffer == CLOSE);
return isTheCloseBuffer;
}
/**
* @return whether there is any content at all
*/
@ -177,6 +188,7 @@ public class HttpContent implements Callback, Closeable
/**
* @return whether the cursor has been advanced past the {@link #isLast() last} position.
*/
@SuppressWarnings("ReferenceEquality")
public boolean isConsumed()
{
return buffer == AFTER;
@ -187,7 +199,7 @@ public class HttpContent implements Callback, Closeable
{
if (isConsumed())
return;
if (buffer == CLOSE)
if (isTheCloseBuffer(buffer))
return;
if (iterator instanceof Callback)
((Callback)iterator).succeeded();
@ -198,7 +210,7 @@ public class HttpContent implements Callback, Closeable
{
if (isConsumed())
return;
if (buffer == CLOSE)
if (isTheCloseBuffer(buffer))
return;
if (iterator instanceof Callback)
((Callback)iterator).failed(x);

View File

@ -204,7 +204,10 @@ public class HttpRequest implements Request
{
if (uri == null)
uri = buildURI(true);
return uri == NULL_URI ? null : uri;
@SuppressWarnings("ReferenceEquality")
boolean isNullURI = (uri == NULL_URI);
return isNullURI ? null : uri;
}
@Override

View File

@ -41,6 +41,7 @@ public class MultiplexConnectionPool extends AbstractConnectionPool implements S
private static final Logger LOG = Log.getLogger(MultiplexConnectionPool.class);
private final ReentrantLock lock = new ReentrantLock();
private final HttpDestination destination;
private final Deque<Holder> idleConnections;
private final Map<Connection, Holder> muxedConnections;
private final Map<Connection, Holder> busyConnections;
@ -49,12 +50,26 @@ public class MultiplexConnectionPool extends AbstractConnectionPool implements S
public MultiplexConnectionPool(HttpDestination destination, int maxConnections, Callback requester, int maxMultiplex)
{
super(destination, maxConnections, requester);
this.destination = destination;
this.idleConnections = new ArrayDeque<>(maxConnections);
this.muxedConnections = new HashMap<>(maxConnections);
this.busyConnections = new HashMap<>(maxConnections);
this.maxMultiplex = maxMultiplex;
}
@Override
public Connection acquire()
{
Connection connection = activate();
if (connection == null)
{
int maxPending = 1 + destination.getQueuedRequestCount() / getMaxMultiplex();
tryCreate(maxPending);
connection = activate();
}
return connection;
}
protected void lock()
{
lock.lock();

View File

@ -27,6 +27,7 @@ import org.eclipse.jetty.client.HttpDestination;
import org.eclipse.jetty.client.Origin;
import org.eclipse.jetty.client.api.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.util.ProcessorUtils;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.annotation.ManagedObject;
@ -35,7 +36,7 @@ public class HttpClientTransportOverHTTP extends AbstractConnectorHttpClientTran
{
public HttpClientTransportOverHTTP()
{
this(Math.max(1, Runtime.getRuntime().availableProcessors() / 2));
this(Math.max( 1, ProcessorUtils.availableProcessors() / 2));
}
public HttpClientTransportOverHTTP(int selectors)

View File

@ -321,10 +321,10 @@ public class HttpSenderOverHTTP extends HttpSender
private void release()
{
ByteBufferPool bufferPool = httpClient.getByteBufferPool();
if (headerBuffer != BufferUtil.EMPTY_BUFFER)
if (!BufferUtil.isTheEmptyBuffer(headerBuffer))
bufferPool.release(headerBuffer);
headerBuffer = null;
if (chunkBuffer != BufferUtil.EMPTY_BUFFER)
if (!BufferUtil.isTheEmptyBuffer(chunkBuffer))
bufferPool.release(chunkBuffer);
chunkBuffer = null;
contentBuffer = null;

View File

@ -589,6 +589,7 @@ public class HttpClientAuthenticationTest extends AbstractHttpClientServerTest
public ByteBuffer current;
@Override
@SuppressWarnings("ReferenceEquality")
public boolean hasNext()
{
if (current == null)

View File

@ -44,6 +44,7 @@ import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.util.thread.ExecutorThreadPool;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.hamcrest.Matchers;
import org.junit.After;
@ -58,7 +59,7 @@ public class HttpClientTLSTest
private void startServer(SslContextFactory sslContextFactory, Handler handler) throws Exception
{
QueuedThreadPool serverThreads = new QueuedThreadPool();
ExecutorThreadPool serverThreads = new ExecutorThreadPool();
serverThreads.setName("server");
server = new Server(serverThreads);

View File

@ -22,6 +22,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@ -45,23 +46,39 @@ public class RoundRobinConnectionPoolTest extends AbstractHttpClientServerTest
@Test
public void testRoundRobin() throws Exception
{
AtomicBoolean record = new AtomicBoolean();
List<Integer> remotePorts = new ArrayList<>();
start(new EmptyServerHandler()
{
@Override
protected void service(String target, Request jettyRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
remotePorts.add(request.getRemotePort());
if (record.get())
remotePorts.add(request.getRemotePort());
}
});
int maxConnections = 3;
client.getTransport().setConnectionPoolFactory(destination -> new RoundRobinConnectionPool(destination, maxConnections, destination));
// Prime the connections, so that they are all opened
// before we actually test the round robin behavior.
String host = "localhost";
int port = connector.getLocalPort();
for (int i = 0; i < maxConnections; ++i)
{
ContentResponse response = client.newRequest(host, port)
.scheme(scheme)
.timeout(5, TimeUnit.SECONDS)
.send();
Assert.assertEquals(HttpStatus.OK_200, response.getStatus());
}
record.set(true);
int requests = 2 * maxConnections - 1;
for (int i = 0; i < requests; ++i)
{
ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
ContentResponse response = client.newRequest(host, port)
.scheme(scheme)
.timeout(5, TimeUnit.SECONDS)
.send();

View File

@ -26,6 +26,7 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
@ -311,10 +312,12 @@ public class DeploymentManager extends ContainerLifeCycle
*/
public Collection<App> getApps(Node node)
{
Objects.requireNonNull(node);
List<App> ret = new ArrayList<>();
for (AppEntry entry : _apps)
{
if (entry.lifecyleNode == node)
if (node.equals(entry.lifecyleNode))
{
ret.add(entry.app);
}

View File

@ -28,7 +28,9 @@ public final class Edge
public Edge(Node from, Node to)
{
if (from==null || to==null || from==to)
@SuppressWarnings("ReferenceEquality")
boolean sameObject = (from==to);
if (from==null || to==null || sameObject)
throw new IllegalArgumentException("from "+from+" to "+to);
_from = from;
_to = to;
@ -71,7 +73,7 @@ public final class Edge
{
return _from;
}
public Node getTo()
{
return _to;

View File

@ -40,7 +40,7 @@ public class Graph
addNode(toNode=edge.getTo());
// replace edge with normalized edge
if (edge.getFrom()!=fromNode || edge.getTo()!=toNode)
if (!edge.getFrom().equals(fromNode) || !edge.getTo().equals(toNode))
edge=new Edge(fromNode,toNode);
this._edges.add(edge);
@ -129,7 +129,7 @@ public class Graph
for (Edge edge : this._edges)
{
if ((edge.getFrom() == node) || (edge.getTo() == node))
if (edge.getFrom().equals(node) || edge.getTo().equals(node))
{
fromedges.add(edge);
}
@ -151,7 +151,7 @@ public class Graph
for (Edge edge : this._edges)
{
if (edge.getFrom() == from)
if (edge.getFrom().equals(from))
{
fromedges.add(edge);
}
@ -192,7 +192,9 @@ public class Graph
*/
public Path getPath(Node from, Node to)
{
if (from == to)
@SuppressWarnings("ReferenceEquality")
boolean sameObject = (from==to);
if (sameObject)
{
return new Path();
}

View File

@ -74,7 +74,7 @@ public class DeploymentManagerMBean extends ObjectMBean
List<String> ret = new ArrayList<>();
for (DeploymentManager.AppEntry entry : _manager.getAppEntries())
{
if (entry.getLifecyleNode() == node)
if (node.equals(entry.getLifecyleNode()))
{
ret.add(toRef(entry.getApp()));
}

View File

@ -35,7 +35,7 @@ _____
|Version |Year |Home |JVM |Protocols |Servlet |JSP |Status
|9.4 |2016- |Eclipse |1.8 |HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI |3.1 |2.3 |Stable
|9.3 |2015- |Eclipse |1.8 |HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI |3.1 |2.3 |Stable
|9.2 |2014- |Eclipse |1.7 |HTTP/1.1 RFC2616, javax.websocket, SPDY v3 |3.1 |2.3 |Deprecated / *End of Life January 2018*
|9.2 |2014-2018 |Eclipse |1.7 |HTTP/1.1 RFC2616, javax.websocket, SPDY v3 |3.1 |2.3 |Deprecated / *End of Life January 2018*
|8 |2009-2014 |Eclipse/Codehaus |1.6 |HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 |3.0 |2.2 |Deprecated / *End of Life November 2014*
|7 |2008-2014 |Eclipse/Codehaus |1.5 |HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 |2.5 |2.1 |Deprecated / *End of Life November 2014*
|6 |2006-2010 |Codehaus |1.4-1.5 |HTTP/1.1 RFC2616 |2.5 |2.0 |Deprecated / *End of Life November 2010*

View File

@ -32,6 +32,7 @@ import org.eclipse.jetty.client.api.Request;
import org.eclipse.jetty.fcgi.FCGI;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.util.ProcessorUtils;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
@ -44,7 +45,7 @@ public class HttpClientTransportOverFCGI extends AbstractConnectorHttpClientTran
public HttpClientTransportOverFCGI(String scriptRoot)
{
this(Math.max(1, Runtime.getRuntime().availableProcessors() / 2), false, scriptRoot);
this( Math.max( 1, ProcessorUtils.availableProcessors() / 2), false, scriptRoot);
}
public HttpClientTransportOverFCGI(int selectors, boolean multiplexed, String scriptRoot)

View File

@ -127,7 +127,9 @@ public class HttpConnectionOverFCGI extends AbstractConnection implements Connec
private void releaseBuffer(ByteBuffer buffer)
{
assert this.buffer == buffer;
@SuppressWarnings("ReferenceEquality")
boolean isCurrentBuffer = (this.buffer == buffer);
assert(isCurrentBuffer);
HttpClient client = destination.getHttpClient();
ByteBufferPool bufferPool = client.getByteBufferPool();
bufferPool.release(buffer);

View File

@ -40,6 +40,7 @@ import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpScheme;
import org.eclipse.jetty.proxy.AsyncProxyServlet;
import org.eclipse.jetty.util.ProcessorUtils;
/**
* Specific implementation of {@link org.eclipse.jetty.proxy.AsyncProxyServlet.Transparent} for FastCGI.
@ -111,7 +112,7 @@ public class FastCGIProxyServlet extends AsyncProxyServlet.Transparent
String scriptRoot = config.getInitParameter(SCRIPT_ROOT_INIT_PARAM);
if (scriptRoot == null)
throw new IllegalArgumentException("Mandatory parameter '" + SCRIPT_ROOT_INIT_PARAM + "' not configured");
int selectors = Math.max(1, Runtime.getRuntime().availableProcessors() / 2);
int selectors = Math.max( 1, ProcessorUtils.availableProcessors() / 2);
String value = config.getInitParameter("selectors");
if (value != null)
selectors = Integer.parseInt(value);

View File

@ -34,6 +34,7 @@ import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.toolchain.test.TestTracker;
import org.eclipse.jetty.util.LeakDetector;
import org.eclipse.jetty.util.ProcessorUtils;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.hamcrest.Matchers;
import org.junit.After;
@ -59,8 +60,8 @@ public abstract class AbstractHttpClientServerTest
ServerFCGIConnectionFactory fcgiConnectionFactory = new ServerFCGIConnectionFactory(new HttpConfiguration());
serverBufferPool = new LeakTrackingByteBufferPool(new MappedByteBufferPool.Tagged());
connector = new ServerConnector(server, null, null, serverBufferPool,
1, Math.max(1, Runtime.getRuntime().availableProcessors() / 2), fcgiConnectionFactory);
connector = new ServerConnector( server, null, null, serverBufferPool,
1, Math.max( 1, ProcessorUtils.availableProcessors() / 2), fcgiConnectionFactory);
// connector.setPort(9000);
server.addConnector(connector);

View File

@ -417,7 +417,9 @@ public class GZIPContentDecoder implements Destroyable
*/
public void release(ByteBuffer buffer)
{
if (_pool!=null && buffer!=BufferUtil.EMPTY_BUFFER)
@SuppressWarnings("ReferenceEquality")
boolean isTheEmptyBuffer = (buffer==BufferUtil.EMPTY_BUFFER);
if (_pool!=null && !isTheEmptyBuffer)
_pool.release(buffer);
}
}

View File

@ -276,9 +276,12 @@ public class HttpField
public boolean isSameName(HttpField field)
{
@SuppressWarnings("ReferenceEquality")
boolean sameObject = (field==this);
if (field==null)
return false;
if (field==this)
if (sameObject)
return true;
if (_header!=null && _header==field.getHeader())
return true;

View File

@ -2025,6 +2025,7 @@ public class HttpParserTest
Assert.assertEquals(null, _bad);
}
@Test
@SuppressWarnings("ReferenceEquality")
public void testCachedField() throws Exception
{
ByteBuffer buffer = BufferUtil.toBuffer(

View File

@ -20,6 +20,7 @@ package org.eclipse.jetty.http2.client;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.channels.SelectableChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.SocketChannel;
@ -122,6 +123,8 @@ public class HTTP2Client extends ContainerLifeCycle
private int selectors = 1;
private long idleTimeout = 30000;
private long connectTimeout = 10000;
private boolean connectBlocking;
private SocketAddress bindAddress;
private int inputBufferSize = 8192;
private List<String> protocols = Arrays.asList("h2", "h2-17", "h2-16", "h2-15", "h2-14");
private int initialSessionRecvWindow = 16 * 1024 * 1024;
@ -266,6 +269,27 @@ public class HTTP2Client extends ContainerLifeCycle
selector.setConnectTimeout(connectTimeout);
}
@ManagedAttribute("Whether the connect() operation is blocking")
public boolean isConnectBlocking()
{
return connectBlocking;
}
public void setConnectBlocking(boolean connectBlocking)
{
this.connectBlocking = connectBlocking;
}
public SocketAddress getBindAddress()
{
return bindAddress;
}
public void setBindAddress(SocketAddress bindAddress)
{
this.bindAddress = bindAddress;
}
@ManagedAttribute("The size of the buffer used to read from the network")
public int getInputBufferSize()
{
@ -325,10 +349,23 @@ public class HTTP2Client extends ContainerLifeCycle
try
{
SocketChannel channel = SocketChannel.open();
SocketAddress bindAddress = getBindAddress();
if (bindAddress != null)
channel.bind(bindAddress);
configure(channel);
channel.configureBlocking(false);
boolean connected = true;
if (isConnectBlocking())
{
channel.socket().connect(address, (int)getConnectTimeout());
channel.configureBlocking(false);
}
else
{
channel.configureBlocking(false);
connected = channel.connect(address);
}
context = contextFrom(sslContextFactory, address, listener, promise, context);
if (channel.connect(address))
if (connected)
selector.accept(channel, context);
else
selector.connect(channel, context);

View File

@ -124,15 +124,15 @@ public class HTTP2ClientConnectionFactory implements ClientConnectionFactory
{
session.frames(null, this, prefaceFrame, settingsFrame);
}
// Only start reading from server after we have sent the client preface,
// otherwise we risk to read the server preface (a SETTINGS frame) and
// reply to that before we have the chance to send the client preface.
super.onOpen();
}
@Override
public void succeeded()
{
// Only start reading from server after we have sent the client preface,
// otherwise we risk to read the server preface (a SETTINGS frame) and
// reply to that before we have the chance to send the client preface.
super.onOpen();
promise.succeeded(getSession());
}

View File

@ -262,7 +262,7 @@ public class StreamResetTest extends AbstractTest
try
{
// Wait for the reset to happen.
Assert.assertTrue(resetLatch.await(5, TimeUnit.SECONDS));
Assert.assertTrue(resetLatch.await(10, TimeUnit.SECONDS));
}
catch (InterruptedException x)
{
@ -273,9 +273,9 @@ public class StreamResetTest extends AbstractTest
{
// Write some content after the stream has
// been reset, it should throw an exception.
for (int i = 0; i < 10; i++)
for (int i = 0; i < 100; i++)
{
Thread.sleep(500);
Thread.sleep(100);
response.getOutputStream().write(data);
response.flushBuffer();
}
@ -304,7 +304,7 @@ public class StreamResetTest extends AbstractTest
}
});
Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
Assert.assertTrue(dataLatch.await(10, TimeUnit.SECONDS));
}
@Test

View File

@ -223,7 +223,7 @@ public class HTTP2Flusher extends IteratingCallback implements Dumpable
IStream stream = entry.stream;
if (stream != null && !entry.isControl())
{
Object channel = stream.getAttribute(IStream.CHANNEL_ATTRIBUTE);
Object channel = stream.getAttachment();
if (channel instanceof WriteFlusher.Listener)
((WriteFlusher.Listener)channel).onFlushed(update - Frame.HEADER_LENGTH);
}

View File

@ -89,6 +89,7 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio
private int initialSessionRecvWindow;
private boolean pushEnabled;
private long idleTime;
private GoAwayFrame closeFrame;
public HTTP2Session(Scheduler scheduler, EndPoint endPoint, Generator generator, Session.Listener listener, FlowControlStrategy flowControl, int initialStreamId)
{
@ -430,6 +431,7 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio
{
// We received a GO_AWAY, so try to write
// what's in the queue and then disconnect.
closeFrame = frame;
notifyClose(this, frame, new DisconnectCallback());
return;
}
@ -597,8 +599,8 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio
{
if (closed.compareAndSet(current, CloseState.LOCALLY_CLOSED))
{
GoAwayFrame frame = newGoAwayFrame(error, reason);
control(null, callback, frame);
closeFrame = newGoAwayFrame(CloseState.LOCALLY_CLOSED, error, reason);
control(null, callback, closeFrame);
return true;
}
break;
@ -614,7 +616,7 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio
}
}
private GoAwayFrame newGoAwayFrame(int error, String reason)
private GoAwayFrame newGoAwayFrame(CloseState closeState, int error, String reason)
{
byte[] payload = null;
if (reason != null)
@ -623,7 +625,7 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio
reason = reason.substring(0, Math.min(reason.length(), 32));
payload = reason.getBytes(StandardCharsets.UTF_8);
}
return new GoAwayFrame(lastStreamId.get(), error, payload);
return new GoAwayFrame(closeState, lastStreamId.get(), error, payload);
}
@Override
@ -1125,7 +1127,7 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio
@Override
public String toString()
{
return String.format("%s@%x{l:%s <-> r:%s,sendWindow=%s,recvWindow=%s,streams=%d,%s}",
return String.format("%s@%x{l:%s <-> r:%s,sendWindow=%s,recvWindow=%s,streams=%d,%s,%s}",
getClass().getSimpleName(),
hashCode(),
getEndPoint().getLocalAddress(),
@ -1133,7 +1135,8 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio
sendWindow,
recvWindow,
streams.size(),
closed);
closed,
closeFrame);
}
private class ControlEntry extends HTTP2Flusher.Entry
@ -1453,7 +1456,7 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio
private void complete()
{
frames(null, Callback.NOOP, newGoAwayFrame(ErrorCode.NO_ERROR.code, null), new DisconnectFrame());
frames(null, Callback.NOOP, newGoAwayFrame(CloseState.CLOSED, ErrorCode.NO_ERROR.code, null), new DisconnectFrame());
}
}

View File

@ -47,6 +47,7 @@ public class HTTP2Stream extends IdleTimeout implements IStream, Callback, Dumpa
{
private static final Logger LOG = Log.getLogger(HTTP2Stream.class);
private final AtomicReference<Object> attachment = new AtomicReference<>();
private final AtomicReference<ConcurrentMap<String, Object>> attributes = new AtomicReference<>();
private final AtomicReference<CloseState> closeState = new AtomicReference<>(CloseState.NOT_CLOSED);
private final AtomicReference<Callback> writing = new AtomicReference<>();
@ -73,6 +74,18 @@ public class HTTP2Stream extends IdleTimeout implements IStream, Callback, Dumpa
return streamId;
}
@Override
public Object getAttachment()
{
return attachment.get();
}
@Override
public void setAttachment(Object attachment)
{
this.attachment.set(attachment);
}
@Override
public boolean isLocal()
{
@ -460,7 +473,7 @@ public class HTTP2Stream extends IdleTimeout implements IStream, Callback, Dumpa
@Override
public String toString()
{
return String.format("%s@%x#%d{sendWindow=%s,recvWindow=%s,reset=%b,%s}", getClass().getSimpleName(),
hashCode(), getId(), sendWindow, recvWindow, isReset(), closeState);
return String.format("%s@%x#%d{sendWindow=%s,recvWindow=%s,reset=%b,%s,attachment=%s}", getClass().getSimpleName(),
hashCode(), getId(), sendWindow, recvWindow, isReset(), closeState, attachment);
}
}

View File

@ -32,12 +32,17 @@ import org.eclipse.jetty.util.Callback;
public interface IStream extends Stream, Closeable
{
/**
* <p>The constant used as attribute key to store/retrieve the HTTP
* channel associated with this stream</p>
*
* @see #setAttribute(String, Object)
* @return the object attached to this stream
* @see #setAttachment(Object)
*/
public static final String CHANNEL_ATTRIBUTE = IStream.class.getName() + ".channel";
public Object getAttachment();
/**
* Attaches the given object to this stream for later retrieval.
*
* @param attachment the object to attach to this stream
*/
public void setAttachment(Object attachment);
/**
* @return whether this stream is local or remote

View File

@ -20,17 +20,25 @@ package org.eclipse.jetty.http2.frames;
import java.nio.charset.StandardCharsets;
import org.eclipse.jetty.http2.CloseState;
import org.eclipse.jetty.http2.ErrorCode;
public class GoAwayFrame extends Frame
{
private final CloseState closeState;
private final int lastStreamId;
private final int error;
private final byte[] payload;
public GoAwayFrame(int lastStreamId, int error, byte[] payload)
{
this(CloseState.REMOTELY_CLOSED, lastStreamId, error, payload);
}
public GoAwayFrame(CloseState closeState, int lastStreamId, int error, byte[] payload)
{
super(FrameType.GO_AWAY);
this.closeState = closeState;
this.lastStreamId = lastStreamId;
this.error = error;
this.payload = payload;
@ -69,10 +77,11 @@ public class GoAwayFrame extends Frame
public String toString()
{
ErrorCode errorCode = ErrorCode.from(error);
return String.format("%s,%d/%s/%s",
return String.format("%s,%d/%s/%s/%s",
super.toString(),
lastStreamId,
errorCode != null ? errorCode.toString() : String.valueOf(error),
tryConvertPayload());
tryConvertPayload(),
closeState);
}
}

View File

@ -131,6 +131,7 @@ public class HpackContextTest
assertNull(ctx.get("name"));
}
@Test
@SuppressWarnings("ReferenceEquality")
public void testGetAddStatic()
{
HpackContext ctx = new HpackContext(4096);

View File

@ -120,4 +120,13 @@ public class HttpChannelOverHTTP2 extends HttpChannel
super.exchangeTerminated(exchange, result);
release();
}
@Override
public String toString()
{
return String.format("%s[send=%s,recv=%s]",
super.toString(),
sender,
receiver);
}
}

View File

@ -124,14 +124,17 @@ public class HttpClientTransportOverHTTP2 extends AbstractHttpClientTransport
@Override
public void connect(InetSocketAddress address, Map<String, Object> context)
{
client.setConnectTimeout(getHttpClient().getConnectTimeout());
HttpClient httpClient = getHttpClient();
client.setConnectTimeout(httpClient.getConnectTimeout());
client.setConnectBlocking(httpClient.isConnectBlocking());
client.setBindAddress(httpClient.getBindAddress());
SessionListenerPromise listenerPromise = new SessionListenerPromise(context);
HttpDestinationOverHTTP2 destination = (HttpDestinationOverHTTP2)context.get(HTTP_DESTINATION_CONTEXT_KEY);
SslContextFactory sslContextFactory = null;
if (HttpScheme.HTTPS.is(destination.getScheme()))
sslContextFactory = getHttpClient().getSslContextFactory();
sslContextFactory = httpClient.getSslContextFactory();
client.connect(sslContextFactory, address, listenerPromise, listenerPromise, context);
}

View File

@ -29,6 +29,7 @@ import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.MetaData;
import org.eclipse.jetty.http2.IStream;
import org.eclipse.jetty.http2.api.Stream;
import org.eclipse.jetty.http2.frames.DataFrame;
import org.eclipse.jetty.http2.frames.HeadersFrame;
@ -64,7 +65,8 @@ public class HttpSenderOverHTTP2 extends HttpSender
@Override
public void succeeded(Stream stream)
{
getHttpChannel().setStream(stream);
channel.setStream(stream);
((IStream)stream).setAttachment(channel);
stream.setIdleTimeout(request.getIdleTimeout());
if (content.hasContent() && !expects100Continue(request))

View File

@ -1,5 +1,5 @@
org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
#org.eclipse.jetty.client.LEVEL=DEBUG
org.eclipse.jetty.client.LEVEL=DEBUG
org.eclipse.jetty.http2.hpack.LEVEL=INFO
#org.eclipse.jetty.http2.LEVEL=DEBUG
#org.eclipse.jetty.io.ssl.LEVEL=DEBUG

View File

@ -25,6 +25,7 @@ import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Queue;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicLong;
@ -172,7 +173,7 @@ public class HTTP2ServerConnection extends HTTP2Connection implements Connection
{
if (LOG.isDebugEnabled())
LOG.debug("Processing {} on {}", frame, stream);
HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttribute(IStream.CHANNEL_ATTRIBUTE);
HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttachment();
if (channel != null)
{
Runnable task = channel.onRequestContent(frame, callback);
@ -189,7 +190,7 @@ public class HTTP2ServerConnection extends HTTP2Connection implements Connection
{
if (LOG.isDebugEnabled())
LOG.debug("Processing trailers {} on {}", frame, stream);
HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttribute(IStream.CHANNEL_ATTRIBUTE);
HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttachment();
if (channel != null)
{
Runnable task = channel.onRequestTrailers(frame);
@ -200,7 +201,7 @@ public class HTTP2ServerConnection extends HTTP2Connection implements Connection
public boolean onStreamTimeout(IStream stream, Throwable failure)
{
HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttribute(IStream.CHANNEL_ATTRIBUTE);
HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttachment();
boolean result = channel != null && channel.onStreamTimeout(failure, task -> offerTask(task, true));
if (LOG.isDebugEnabled())
LOG.debug("{} idle timeout on {}: {}", result ? "Processed" : "Ignored", stream, failure);
@ -211,7 +212,7 @@ public class HTTP2ServerConnection extends HTTP2Connection implements Connection
{
if (LOG.isDebugEnabled())
LOG.debug("Processing failure on {}: {}", stream, failure);
HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttribute(IStream.CHANNEL_ATTRIBUTE);
HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttachment();
if (channel != null)
{
Runnable task = channel.onFailure(failure, callback);
@ -227,13 +228,13 @@ public class HTTP2ServerConnection extends HTTP2Connection implements Connection
public boolean onSessionTimeout(Throwable failure)
{
ISession session = getSession();
boolean result = true;
for (Stream stream : session.getStreams())
{
HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttribute(IStream.CHANNEL_ATTRIBUTE);
if (channel != null)
result &= channel.isRequestIdle();
}
// Compute whether all requests are idle.
boolean result = session.getStreams().stream()
.map(stream -> (IStream)stream)
.map(stream -> (HttpChannelOverHTTP2)stream.getAttachment())
.filter(Objects::nonNull)
.map(HttpChannelOverHTTP2::isRequestIdle)
.reduce(true, Boolean::logicalAnd);
if (LOG.isDebugEnabled())
LOG.debug("{} idle timeout on {}: {}", result ? "Processed" : "Ignored", session, failure);
return result;
@ -284,7 +285,7 @@ public class HTTP2ServerConnection extends HTTP2Connection implements Connection
if (LOG.isDebugEnabled())
LOG.debug("Creating channel {} for {}", channel, this);
}
stream.setAttribute(IStream.CHANNEL_ATTRIBUTE, channel);
stream.setAttachment(channel);
return channel;
}
@ -379,7 +380,7 @@ public class HTTP2ServerConnection extends HTTP2Connection implements Connection
@Override
public void recycle()
{
getStream().removeAttribute(IStream.CHANNEL_ATTRIBUTE);
getStream().setAttachment(null);
super.recycle();
offerHttpChannel(this);
}

View File

@ -248,7 +248,7 @@ public class HttpTransportOverHTTP2 implements HttpTransport
// Consume the existing queued data frames to
// avoid stalling the session flow control.
HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttribute(IStream.CHANNEL_ATTRIBUTE);
HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttachment();
if (channel != null)
channel.consumeInput();
}

View File

@ -202,7 +202,7 @@ public class ByteArrayEndPoint extends AbstractEndPoint
throw new ClosedChannelException();
ByteBuffer in = _inQ.peek();
if (BufferUtil.hasContent(in) || in==EOF)
if (BufferUtil.hasContent(in) || isEOF(in))
execute(_runFillable);
}
}
@ -224,7 +224,7 @@ public class ByteArrayEndPoint extends AbstractEndPoint
boolean fillable=false;
try(Locker.Lock lock = _locker.lock())
{
if (_inQ.peek()==EOF)
if (isEOF(_inQ.peek()))
throw new RuntimeIOException(new EOFException());
boolean was_empty=_inQ.isEmpty();
if (in==null)
@ -248,7 +248,7 @@ public class ByteArrayEndPoint extends AbstractEndPoint
boolean fillable=false;
try(Locker.Lock lock = _locker.lock())
{
if (_inQ.peek()==EOF)
if (isEOF(_inQ.peek()))
throw new RuntimeIOException(new EOFException());
boolean was_empty=_inQ.isEmpty();
if (in==null)
@ -415,7 +415,7 @@ public class ByteArrayEndPoint extends AbstractEndPoint
break;
ByteBuffer in= _inQ.peek();
if (in==EOF)
if (isEOF(in))
{
filled=-1;
break;
@ -550,4 +550,16 @@ public class ByteArrayEndPoint extends AbstractEndPoint
return String.format("%s[q=%d,q[0]=%s,o=%s]",super.toString(),q,b,o);
}
/* ------------------------------------------------------------ */
/**
* Compares a ByteBuffer Object to EOF by Reference
* @param buffer the input ByteBuffer to be compared to EOF
* @return Whether the reference buffer is equal to that of EOF
*/
private static boolean isEOF(ByteBuffer buffer)
{
@SuppressWarnings("ReferenceEquality")
boolean is_EOF = (buffer==EOF);
return is_EOF;
}
}

View File

@ -94,7 +94,7 @@ public class ConnectionStatistics extends AbstractLifeCycle implements Connectio
_connections.decrement();
long elapsed = System.currentTimeMillis() - connection.getCreatedTimeStamp();
_connectionsDuration.set(elapsed);
_connectionsDuration.record(elapsed);
long bytesIn = connection.getBytesIn();
if (bytesIn > 0)

View File

@ -42,6 +42,7 @@ import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.jetty.io.ManagedSelector.Connect;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.component.DumpableCollection;
@ -185,24 +186,7 @@ public class ManagedSelector extends ContainerLifeCycle implements Dumpable
if (connect.timeout.cancel())
{
key.interestOps(0);
execute(new Runnable()
{
@Override
public void run()
{
try
{
createEndPoint(channel,key);
}
catch(Throwable failure)
{
closeNoExceptions(channel);
LOG.warn(String.valueOf(failure));
LOG.debug(failure);
connect.failed(failure);
}
}
});
execute(new CreateEndPoint(connect,key));
}
else
{
@ -730,6 +714,12 @@ public class ManagedSelector extends ContainerLifeCycle implements Dumpable
ManagedSelector.this._selectorManager.connectionFailed(channel, failure, attachment);
}
}
@Override
public String toString()
{
return String.format("Connect@%x{%s,%s}",hashCode(),channel,attachment);
}
}
private class CloseConnections implements SelectorUpdate
@ -816,7 +806,40 @@ public class ManagedSelector extends ContainerLifeCycle implements Dumpable
}
}
private final class CreateEndPoint implements Runnable
{
private final Connect _connect;
private final SelectionKey _key;
private CreateEndPoint(Connect connect, SelectionKey key)
{
_connect = connect;
_key = key;
}
@Override
public void run()
{
try
{
createEndPoint(_connect.channel,_key);
}
catch(Throwable failure)
{
closeNoExceptions(_connect.channel);
LOG.warn(String.valueOf(failure));
LOG.debug(failure);
_connect.failed(failure);
}
}
@Override
public String toString()
{
return String.format("CreateEndPoint@%x{%s,%s}",hashCode(),_connect,_key);
}
}
private class DestroyEndPoint implements Runnable, Closeable
{
private final EndPoint endPoint;

View File

@ -32,6 +32,7 @@ import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.IntUnaryOperator;
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.component.ContainerLifeCycle;
@ -68,10 +69,10 @@ public abstract class SelectorManager extends ContainerLifeCycle implements Dump
if (executor instanceof ThreadPool.SizedThreadPool)
{
int threads = ((ThreadPool.SizedThreadPool)executor).getMaxThreads();
int cpus = Runtime.getRuntime().availableProcessors();
int cpus = ProcessorUtils.availableProcessors();
return Math.max(1,Math.min(cpus/2,threads/16));
}
return Math.max(1,Runtime.getRuntime().availableProcessors()/2);
return Math.max(1,ProcessorUtils.availableProcessors()/2);
}
protected SelectorManager(Executor executor, Scheduler scheduler)

View File

@ -627,8 +627,12 @@ public class SslConnection extends AbstractConnection
// We also need an app buffer, but can use the passed buffer if it is big enough
ByteBuffer app_in;
boolean used_passed_buffer = false;
if (BufferUtil.space(buffer) > _sslEngine.getSession().getApplicationBufferSize())
{
app_in = buffer;
used_passed_buffer = true;
}
else if (_decryptedInput == null)
app_in = _decryptedInput = _bufferPool.acquire(_sslEngine.getSession().getApplicationBufferSize(), _decryptedDirectBuffers);
else
@ -730,7 +734,7 @@ public class SslConnection extends AbstractConnection
// another call to fill() or flush().
if (unwrapResult.bytesProduced() > 0)
{
if (app_in == buffer)
if (used_passed_buffer)
return unwrapResult.bytesProduced();
return BufferUtil.append(buffer,_decryptedInput);
}

View File

@ -29,6 +29,7 @@ import java.util.Arrays;
import org.eclipse.jetty.io.ByteBufferPool.Bucket;
import org.junit.Test;
@SuppressWarnings("ReferenceEquality")
public class ArrayByteBufferPoolTest
{
@Test
@ -113,6 +114,7 @@ public class ArrayByteBufferPoolTest
}
@Test
@SuppressWarnings("ReferenceEquality")
public void testAcquireReleaseAcquire() throws Exception
{
ArrayByteBufferPool bufferPool = new ArrayByteBufferPool(10,100,1000);

View File

@ -317,8 +317,8 @@ public class ByteArrayEndPointTest
// Write more than the output capacity, then wait for idle timeout.
fcb = new FutureCallback();
endp.write(fcb, BufferUtil.toBuffer("This is too long"));
start = System.nanoTime();
endp.write(fcb, BufferUtil.toBuffer("This is too long"));
try
{
fcb.get();

View File

@ -446,6 +446,7 @@ public class SelectChannelEndPointTest
_manager.accept(server);
// Write client to server
long start = TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
client.getOutputStream().write("HelloWorld".getBytes(StandardCharsets.UTF_8));
// Verify echo server to client
@ -457,7 +458,6 @@ public class SelectChannelEndPointTest
}
Assert.assertTrue(_lastEndPointLatch.await(1, TimeUnit.SECONDS));
long start = TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
_lastEndPoint.setIdleTimeout(idleTimeout);
// read until idle shutdown received

View File

@ -13,7 +13,6 @@
<mavenVersion>3.5.0</mavenVersion>
<pluginToolsVersion>3.5</pluginToolsVersion>
<bundle-symbolic-name>${project.groupId}.maven.plugin</bundle-symbolic-name>
<surefireVersion>2.20.1</surefireVersion>
<it.debug>false</it.debug>
<jetty.stopKey>FREEBEER</jetty.stopKey>
<jetty.jvmArgs></jetty.jvmArgs>

View File

@ -65,7 +65,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<version>@surefireVersion@</version>
<configuration>
<systemPropertyVariables>
<jetty.port.file>${jetty.port.file}</jetty.port.file>

View File

@ -72,7 +72,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<version>@surefireVersion@</version>
<configuration>
<systemPropertyVariables>
<jetty.port.file>${jetty.port.file}</jetty.port.file>

View File

@ -68,7 +68,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<version>@surefireVersion@</version>
<configuration>
<systemPropertyVariables>
<jetty.port.file>${jetty.port.file}</jetty.port.file>

View File

@ -64,7 +64,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<version>@surefireVersion@</version>
<configuration>
<systemPropertyVariables>
<jetty.port.file>${jetty.port.file}</jetty.port.file>

View File

@ -25,7 +25,6 @@ import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import org.eclipse.jetty.annotations.AnnotationParser.Handler;
import org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration;
import org.eclipse.jetty.osgi.boot.OSGiWebappConstants;
@ -117,6 +116,7 @@ public class AnnotationConfiguration extends org.eclipse.jetty.annotations.Annot
_webInfLibStats = new CounterStatistic();
Bundle webbundle = (Bundle) context.getAttribute(OSGiWebappConstants.JETTY_OSGI_BUNDLE);
@SuppressWarnings("unchecked")
Set<Bundle> fragAndRequiredBundles = (Set<Bundle>)context.getAttribute(OSGiWebInfConfiguration.FRAGMENT_AND_REQUIRED_BUNDLES);
if (fragAndRequiredBundles != null)
{
@ -230,7 +230,7 @@ public class AnnotationConfiguration extends org.eclipse.jetty.annotations.Annot
{
Resource bundleRes = parser.getResource(bundle);
Set<Handler> handlers = new HashSet<Handler>();
Set<Handler> handlers = new HashSet<>();
handlers.addAll(_discoverableAnnotationHandlers);
if (_classInheritanceHandler != null)
handlers.add(_classInheritanceHandler);

View File

@ -42,10 +42,10 @@ public class AnnotationParser extends org.eclipse.jetty.annotations.AnnotationPa
{
private Set<URI> _alreadyParsed = ConcurrentHashMap.newKeySet();
private ConcurrentHashMap<URI,Bundle> _uriToBundle = new ConcurrentHashMap<URI, Bundle>();
private ConcurrentHashMap<Bundle,Resource> _bundleToResource = new ConcurrentHashMap<Bundle,Resource>();
private ConcurrentHashMap<Resource, Bundle> _resourceToBundle = new ConcurrentHashMap<Resource, Bundle>();
private ConcurrentHashMap<Bundle,URI> _bundleToUri = new ConcurrentHashMap<Bundle, URI>();
private ConcurrentHashMap<URI,Bundle> _uriToBundle = new ConcurrentHashMap<>();
private ConcurrentHashMap<Bundle,Resource> _bundleToResource = new ConcurrentHashMap<>();
private ConcurrentHashMap<Resource, Bundle> _resourceToBundle = new ConcurrentHashMap<>();
private ConcurrentHashMap<Bundle,URI> _bundleToUri = new ConcurrentHashMap<>();
public AnnotationParser(int javaPlatform)
{
@ -126,7 +126,7 @@ public class AnnotationParser extends org.eclipse.jetty.annotations.AnnotationPa
bundleClasspath = ".";
}
//order the paths first by the number of tokens in the path second alphabetically.
TreeSet<String> paths = new TreeSet<String>(
TreeSet<String> paths = new TreeSet<>(
new Comparator<String>()
{
@Override
@ -177,6 +177,7 @@ public class AnnotationParser extends org.eclipse.jetty.annotations.AnnotationPa
paths.add("/target/classes/");
}
}
@SuppressWarnings("rawtypes")
Enumeration classes = bundle.findEntries("/","*.class",true);
if (classes == null)
{

View File

@ -48,7 +48,7 @@ public class BundleWebAppProvider extends AbstractWebAppProvider implements Bund
/**
* Map of Bundle to App. Used when a Bundle contains a webapp.
*/
private Map<Bundle, App> _bundleMap = new HashMap<Bundle, App>();
private Map<Bundle, App> _bundleMap = new HashMap<>();
private ServiceRegistration _serviceRegForBundles;
@ -125,7 +125,7 @@ public class BundleWebAppProvider extends AbstractWebAppProvider implements Bund
_webappTracker = new WebAppTracker(FrameworkUtil.getBundle(this.getClass()).getBundleContext(), getServerInstanceWrapper().getManagedServerName());
_webappTracker.open();
//register as an osgi service for deploying bundles, advertising the name of the jetty Server instance we are related to
Dictionary<String,String> properties = new Hashtable<String,String>();
Dictionary<String,String> properties = new Hashtable<>();
properties.put(OSGiServerConstants.MANAGED_JETTY_SERVER_NAME, getServerInstanceWrapper().getManagedServerName());
_serviceRegForBundles = FrameworkUtil.getBundle(this.getClass()).getBundleContext().registerService(BundleProvider.class.getName(), this, properties);
super.doStart();
@ -177,6 +177,7 @@ public class BundleWebAppProvider extends AbstractWebAppProvider implements Bund
String contextPath = null;
try
{
@SuppressWarnings("unchecked")
Dictionary<String,String> headers = bundle.getHeaders();
//does the bundle have a OSGiWebappConstants.JETTY_WAR_FOLDER_PATH

View File

@ -80,7 +80,7 @@ public class JettyBootstrapActivator implements BundleActivator
_jettyServerServiceTracker.open();
// Create a default jetty instance right now.
Server defaultServer = DefaultJettyAtJettyHomeHelper.startJettyAtJettyHome(context);
DefaultJettyAtJettyHomeHelper.startJettyAtJettyHome(context);
}

View File

@ -95,7 +95,7 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration
// 2. DeployerManager.setContextAttribute CONTAINER_BUNDLE_PATTERN
String tmp = (String)context.getAttribute(CONTAINER_BUNDLE_PATTERN);
Pattern pattern = (tmp==null?null:Pattern.compile(tmp));
List<String> names = new ArrayList<String>();
List<String> names = new ArrayList<>();
tmp = System.getProperty(SYS_PROP_TLD_BUNDLES);
if (tmp != null)
{
@ -103,7 +103,7 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration
while (tokenizer.hasMoreTokens())
names.add(tokenizer.nextToken());
}
HashSet<Resource> matchingResources = new HashSet<Resource>();
HashSet<Resource> matchingResources = new HashSet<>();
if ( !names.isEmpty() || pattern != null)
{
Bundle[] bundles = FrameworkUtil.getBundle(OSGiWebInfConfiguration.class).getBundleContext().getBundles();
@ -153,7 +153,7 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration
protected List<Resource> findJars (WebAppContext context)
throws Exception
{
List<Resource> mergedResources = new ArrayList<Resource>();
List<Resource> mergedResources = new ArrayList<>();
//get jars from WEB-INF/lib if there are any
List<Resource> webInfJars = super.findJars(context);
if (webInfJars != null)
@ -163,17 +163,19 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration
Bundle[] bundles = PackageAdminServiceTracker.INSTANCE.getFragmentsAndRequiredBundles((Bundle)context.getAttribute(OSGiWebappConstants.JETTY_OSGI_BUNDLE));
if (bundles != null && bundles.length > 0)
{
@SuppressWarnings("unchecked")
Set<Bundle> fragsAndReqsBundles = (Set<Bundle>)context.getAttribute(FRAGMENT_AND_REQUIRED_BUNDLES);
if (fragsAndReqsBundles == null)
{
fragsAndReqsBundles = new HashSet<Bundle>();
fragsAndReqsBundles = new HashSet<>();
context.setAttribute(FRAGMENT_AND_REQUIRED_BUNDLES, fragsAndReqsBundles);
}
@SuppressWarnings("unchecked")
Set<Resource> fragsAndReqsResources = (Set<Resource>)context.getAttribute(FRAGMENT_AND_REQUIRED_RESOURCES);
if (fragsAndReqsResources == null)
{
fragsAndReqsResources = new HashSet<Resource>();
fragsAndReqsResources = new HashSet<>();
context.setAttribute(FRAGMENT_AND_REQUIRED_RESOURCES, fragsAndReqsResources);
}
@ -207,12 +209,13 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration
@Override
public void configure(WebAppContext context) throws Exception
{
TreeMap<String, Resource> prependedResourcesPath = new TreeMap<String, Resource>();
TreeMap<String, Resource> appendedResourcesPath = new TreeMap<String, Resource>();
TreeMap<String, Resource> prependedResourcesPath = new TreeMap<>();
TreeMap<String, Resource> appendedResourcesPath = new TreeMap<>();
Bundle bundle = (Bundle)context.getAttribute(OSGiWebappConstants.JETTY_OSGI_BUNDLE);
if (bundle != null)
{
@SuppressWarnings("unchecked")
Set<Bundle> fragments = (Set<Bundle>)context.getAttribute(FRAGMENT_AND_REQUIRED_BUNDLES);
if (fragments != null && !fragments.isEmpty())
{
@ -238,8 +241,9 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration
}
if (!appendedResourcesPath.isEmpty())
{
LinkedHashSet<Resource> resources = new LinkedHashSet<Resource>();
LinkedHashSet<Resource> resources = new LinkedHashSet<>();
//Add in any existing setting of extra resource dirs
@SuppressWarnings("unchecked")
Set<Resource> resourceDirs = (Set<Resource>)context.getAttribute(WebInfConfiguration.RESOURCE_DIRS);
if (resourceDirs != null && !resourceDirs.isEmpty())
resources.addAll(resourceDirs);
@ -272,7 +276,7 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration
private List<Resource> getBundleAsResource(Bundle bundle)
throws Exception
{
List<Resource> resources = new ArrayList<Resource>();
List<Resource> resources = new ArrayList<>();
File file = BundleFileLocatorHelperFactory.getFactory().getHelper().getBundleInstallLocation(bundle);
if (file.isDirectory())

View File

@ -29,7 +29,6 @@ import org.eclipse.jetty.deploy.DeploymentManager;
import org.eclipse.jetty.osgi.boot.internal.serverfactory.ServerInstanceWrapper;
import org.eclipse.jetty.osgi.boot.utils.Util;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.osgi.framework.Bundle;
@ -52,7 +51,7 @@ public class ServiceContextProvider extends AbstractContextProvider implements S
{
private static final Logger LOG = Log.getLogger(AbstractContextProvider.class);
private Map<ServiceReference, App> _serviceMap = new HashMap<ServiceReference, App>();
private Map<ServiceReference, App> _serviceMap = new HashMap<>();
private ServiceRegistration _serviceRegForServices;
@ -169,7 +168,7 @@ public class ServiceContextProvider extends AbstractContextProvider implements S
contextFile = (String)serviceRef.getProperty(OSGiWebappConstants.SERVICE_PROP_CONTEXT_FILE_PATH);
String[] keys = serviceRef.getPropertyKeys();
Dictionary properties = new Hashtable<String, Object>();
Dictionary<String,Object> properties = new Hashtable<>();
if (keys != null)
{
for (String key:keys)
@ -228,7 +227,7 @@ public class ServiceContextProvider extends AbstractContextProvider implements S
//register as an osgi service for deploying contexts defined in a bundle, advertising the name of the jetty Server instance we are related to
Dictionary<String,String> properties = new Hashtable<String,String>();
Dictionary<String,String> properties = new Hashtable<>();
properties.put(OSGiServerConstants.MANAGED_JETTY_SERVER_NAME, getServerInstanceWrapper().getManagedServerName());
//register as an osgi service for deploying contexts, advertising the name of the jetty Server instance we are related to

View File

@ -29,7 +29,6 @@ import org.eclipse.jetty.deploy.DeploymentManager;
import org.eclipse.jetty.osgi.boot.internal.serverfactory.ServerInstanceWrapper;
import org.eclipse.jetty.osgi.boot.utils.Util;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.webapp.WebAppContext;
@ -53,7 +52,7 @@ public class ServiceWebAppProvider extends AbstractWebAppProvider implements Ser
/**
* Map of ServiceRef to App. Used when it is an osgi service that is a WebAppContext.
*/
private Map<ServiceReference, App> _serviceMap = new HashMap<ServiceReference, App>();
private Map<ServiceReference, App> _serviceMap = new HashMap<>();
private ServiceRegistration _serviceRegForServices;
@ -117,7 +116,7 @@ public class ServiceWebAppProvider extends AbstractWebAppProvider implements Ser
public class ServiceApp extends OSGiApp
{
public ServiceApp(DeploymentManager manager, AppProvider provider, Bundle bundle, Dictionary properties, String originId)
public ServiceApp(DeploymentManager manager, AppProvider provider, Bundle bundle, Dictionary<String,String> properties, String originId)
{
super(manager, provider, bundle, properties, originId);
}
@ -168,7 +167,7 @@ public class ServiceWebAppProvider extends AbstractWebAppProvider implements Ser
WebAppContext webApp = (WebAppContext)context;
Dictionary properties = new Hashtable<String,String>();
Dictionary<String,String> properties = new Hashtable<>();
String contextPath = (String)serviceRef.getProperty(OSGiWebappConstants.RFC66_WEB_CONTEXTPATH);
if (contextPath == null)
@ -275,7 +274,7 @@ public class ServiceWebAppProvider extends AbstractWebAppProvider implements Ser
webappTracker.open();
//register as an osgi service for deploying bundles, advertising the name of the jetty Server instance we are related to
Dictionary<String,String> properties = new Hashtable<String,String>();
Dictionary<String,String> properties = new Hashtable<>();
properties.put(OSGiServerConstants.MANAGED_JETTY_SERVER_NAME, getServerInstanceWrapper().getManagedServerName());
//register as an osgi service for deploying contexts (discovered as osgi services), advertising the name of the jetty Server instance we are related to

View File

@ -102,7 +102,7 @@ public class DefaultJettyAtJettyHomeHelper
File jettyHomeDir = null;
Bundle jettyHomeBundle = null;
Dictionary<String,String> properties = new Hashtable<String,String>();
Dictionary<String, Object> properties = new Hashtable<>();
if (jettyHomeSysProp != null)
{
jettyHomeSysProp = Util.resolvePropertyValue(jettyHomeSysProp);
@ -157,8 +157,8 @@ public class DefaultJettyAtJettyHomeHelper
List<URL> configURLs = jettyHomeDir != null ? getJettyConfigurationURLs(jettyHomeDir) : getJettyConfigurationURLs(jettyHomeBundle, properties);
LOG.info("Configuring the default jetty server with {}",configURLs);
String home=properties.get(OSGiServerConstants.JETTY_HOME);
String base=properties.get(OSGiServerConstants.JETTY_BASE);
String home=(String)properties.get(OSGiServerConstants.JETTY_HOME);
String base=(String)properties.get(OSGiServerConstants.JETTY_BASE);
if (base==null)
base=home;
LOG.info("JETTY.HOME="+home);
@ -178,7 +178,6 @@ public class DefaultJettyAtJettyHomeHelper
Util.setProperty(properties, OSGiServerConstants.JETTY_BASE, base);
Server server = ServerInstanceWrapper.configure(null, configURLs, properties);
//Register the default Server instance as an OSGi service.
//The JettyServerServiceTracker will notice it and set it up to deploy bundles as wars etc
bundleContext.registerService(Server.class.getName(), server, properties);
@ -213,7 +212,7 @@ public class DefaultJettyAtJettyHomeHelper
private static List<URL> getJettyConfigurationURLs(File jettyhome)
throws MalformedURLException
{
List<URL> configURLs = new ArrayList<URL>();
List<URL> configURLs = new ArrayList<>();
String jettyetc = System.getProperty(JETTY_ETC_FILES, DEFAULT_JETTY_ETC_FILES);
StringTokenizer tokenizer = new StringTokenizer(jettyetc, ";,", false);
while (tokenizer.hasMoreTokens())
@ -241,7 +240,7 @@ public class DefaultJettyAtJettyHomeHelper
private static List<URL> getJettyConfigurationURLs(Bundle configurationBundle, Dictionary properties)
throws Exception
{
List<URL> configURLs = new ArrayList<URL>();
List<URL> configURLs = new ArrayList<>();
String files = System.getProperty(JETTY_ETC_FILES, DEFAULT_JETTY_ETC_FILES);
StringTokenizer tokenizer = new StringTokenizer(files, ";,", false);

View File

@ -18,6 +18,8 @@
package org.eclipse.jetty.osgi.boot.internal.serverfactory;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Properties;
import org.eclipse.jetty.osgi.boot.OSGiServerConstants;
@ -52,11 +54,10 @@ public class JettyServerServiceTracker implements ServiceTrackerCustomizer
if (name == null) { throw new IllegalArgumentException("The property " + OSGiServerConstants.MANAGED_JETTY_SERVER_NAME + " is mandatory"); }
if (LOG.isDebugEnabled()) LOG.debug("Adding Server {}", name);
ServerInstanceWrapper wrapper = new ServerInstanceWrapper(name);
Properties props = new Properties();
Dictionary<String,Object> props = new Hashtable<>();
for (String key : sr.getPropertyKeys())
{
Object value = sr.getProperty(key);
props.put(key, value);
props.put(key, sr.getProperty(key));
}
try
{

View File

@ -72,7 +72,7 @@ public class ServerInstanceWrapper
public static final String PROPERTY_THIS_JETTY_XML_FOLDER_URL = "this.jetty.xml.parent.folder.url";
private static Collection<TldBundleDiscoverer> __containerTldBundleDiscoverers = new ArrayList<TldBundleDiscoverer>();
private static Collection<TldBundleDiscoverer> __containerTldBundleDiscoverers = new ArrayList<>();
private static Logger LOG = Log.getLogger(ServerInstanceWrapper.class.getName());
@ -114,12 +114,12 @@ public class ServerInstanceWrapper
/* ------------------------------------------------------------ */
public static Server configure(Server server, List<URL> jettyConfigurations, Dictionary props) throws Exception
public static Server configure(Server server, List<URL> jettyConfigurations, Dictionary<String, Object> props) throws Exception
{
if (jettyConfigurations == null || jettyConfigurations.isEmpty()) { return server; }
Map<String, Object> id_map = new HashMap<String, Object>();
Map<String, Object> id_map = new HashMap<>();
if (server != null)
{
//Put in a mapping for the id "Server" and the name of the server as the instance being configured
@ -127,18 +127,16 @@ public class ServerInstanceWrapper
id_map.put((String)props.get(OSGiServerConstants.MANAGED_JETTY_SERVER_NAME), server);
}
Map<String, String> properties = new HashMap<String, String>();
Map<String, String> properties = new HashMap<>();
if (props != null)
{
Enumeration<Object> en = props.keys();
Enumeration<String> en = props.keys();
while (en.hasMoreElements())
{
Object key = en.nextElement();
String key = en.nextElement();
Object value = props.get(key);
String keyStr = String.valueOf(key);
String valStr = String.valueOf(value);
properties.put(keyStr, valStr);
if (server != null) server.setAttribute(keyStr, valStr);
properties.put(key, value.toString());
if (server != null) server.setAttribute(key, value);
}
}
@ -153,7 +151,7 @@ public class ServerInstanceWrapper
throw new IllegalStateException("No such jetty server config file: "+r);
}
XmlConfiguration config = new XmlConfiguration(r.getURL());
XmlConfiguration config = new XmlConfiguration(r.getURI().toURL());
config.getIdMap().putAll(id_map);
config.getProperties().putAll(properties);
@ -243,7 +241,7 @@ public class ServerInstanceWrapper
}
/* ------------------------------------------------------------ */
public void start(Server server, Dictionary props) throws Exception
public void start(Server server, Dictionary<String,Object> props) throws Exception
{
_server = server;
ClassLoader contextCl = Thread.currentThread().getContextClassLoader();
@ -274,7 +272,7 @@ public class ServerInstanceWrapper
//as on the webapp classpath.
if (!__containerTldBundleDiscoverers.isEmpty())
{
Set<URL> urls = new HashSet<URL>();
Set<URL> urls = new HashSet<>();
//discover bundles with tlds that need to be on the container's classpath as URLs
for (TldBundleDiscoverer d:__containerTldBundleDiscoverers)
{
@ -350,7 +348,7 @@ public class ServerInstanceWrapper
if (_ctxtCollection == null)
throw new IllegalStateException("ERROR: No ContextHandlerCollection configured in Server");
List<String> providerClassNames = new ArrayList<String>();
List<String> providerClassNames = new ArrayList<>();
// get a deployerManager and some providers
Collection<DeploymentManager> deployers = _server.getBeans(DeploymentManager.class);
@ -372,7 +370,7 @@ public class ServerInstanceWrapper
}
_deploymentManager.setUseStandardBindings(false);
List<AppLifeCycle.Binding> deploymentLifeCycleBindings = new ArrayList<AppLifeCycle.Binding>();
List<AppLifeCycle.Binding> deploymentLifeCycleBindings = new ArrayList<>();
deploymentLifeCycleBindings.add(new OSGiDeployer(this));
deploymentLifeCycleBindings.add(new StandardStarter());
deploymentLifeCycleBindings.add(new StandardStopper());
@ -446,7 +444,7 @@ public class ServerInstanceWrapper
private List<File> extractFiles(String propertyValue)
{
StringTokenizer tokenizer = new StringTokenizer(propertyValue, ",;", false);
List<File> files = new ArrayList<File>();
List<File> files = new ArrayList<>();
while (tokenizer.hasMoreTokens())
{
String tok = tokenizer.nextToken();

View File

@ -68,7 +68,7 @@ public class LibExtClassLoaderHelper
public static final Set<IFilesInJettyHomeResourcesProcessor> registeredFilesInJettyHomeResourcesProcessors = new HashSet<IFilesInJettyHomeResourcesProcessor>();
public static final Set<IFilesInJettyHomeResourcesProcessor> registeredFilesInJettyHomeResourcesProcessors = new HashSet<>();
/* ------------------------------------------------------------ */
@ -83,12 +83,12 @@ public class LibExtClassLoaderHelper
public static ClassLoader createLibEtcClassLoader(File jettyHome, ClassLoader parentClassLoader) throws MalformedURLException
{
if (jettyHome == null) { return parentClassLoader; }
ArrayList<URL> urls = new ArrayList<URL>();
ArrayList<URL> urls = new ArrayList<>();
File jettyResources = new File(jettyHome, "resources");
if (jettyResources.exists())
{
// make sure it contains something else than README:
Map<String, File> jettyResFiles = new HashMap<String, File>();
Map<String, File> jettyResFiles = new HashMap<>();
for (File f : jettyResources.listFiles())
{
jettyResFiles.put(f.getName(), f);
@ -143,7 +143,7 @@ public class LibExtClassLoaderHelper
throws MalformedURLException
{
if (jarsContainerOrJars == null && otherJarsOrFolder == null) { return parentClassLoader; }
List<URL> urls = new ArrayList<URL>();
List<URL> urls = new ArrayList<>();
if (otherJarsOrFolder != null)
{
urls.addAll(otherJarsOrFolder);

View File

@ -57,7 +57,7 @@ public class OSGiWebappClassLoader extends WebAppClassLoader implements BundleRe
* when a logging framework is setup in the osgi classloaders, it can access
* this and register the classes that must not be found in the jar.
*/
public static final Set<String> JAR_WITH_SUCH_CLASS_MUST_BE_EXCLUDED = new HashSet<String>();
public static final Set<String> JAR_WITH_SUCH_CLASS_MUST_BE_EXCLUDED = new HashSet<>();
public static void addClassThatIdentifiesAJarThatMustBeRejected(Class<?> zclass)
{
@ -150,7 +150,7 @@ public class OSGiWebappClassLoader extends WebAppClassLoader implements BundleRe
/* ------------------------------------------------------------ */
private List<URL> toList(Enumeration<URL> e, Enumeration<URL> e2)
{
List<URL> list = new ArrayList<URL>();
List<URL> list = new ArrayList<>();
while (e != null && e.hasMoreElements())
list.add(e.nextElement());
while (e2 != null && e2.hasMoreElements())

View File

@ -19,7 +19,6 @@
package org.eclipse.jetty.osgi.boot.utils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;

View File

@ -23,7 +23,6 @@ import java.util.Hashtable;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import org.osgi.util.tracker.ServiceTracker;
@ -68,7 +67,7 @@ public class EventSender
{
EventAdmin service = (EventAdmin)_serviceTracker.getService();
if (service != null) {
Dictionary<String,Object> props = new Hashtable<String,Object>();
Dictionary<String,Object> props = new Hashtable<>();
props.put("bundle.symbolicName", wab.getSymbolicName());
props.put("bundle.id", wab.getBundleId());
props.put("bundle", wab);

View File

@ -166,7 +166,7 @@ public class OSGiClassLoader extends URLClassLoader
*/
private List<URL> toList(Enumeration<URL> e, Enumeration<URL> e2)
{
List<URL> list = new ArrayList<URL>();
List<URL> list = new ArrayList<>();
while (e != null && e.hasMoreElements())
list.add(e.nextElement());
while (e2 != null && e2.hasMoreElements())

View File

@ -72,7 +72,7 @@ public class Util
* @param manifest the dictionary
* @return the value from the manifest
*/
public static String getManifestHeaderValue (String name, String altName, Dictionary manifest)
public static String getManifestHeaderValue (String name, String altName, Dictionary<String,String> manifest)
{
if (manifest == null)
return null;
@ -103,7 +103,7 @@ public class Util
delims = separators;
StringTokenizer tokenizer = new StringTokenizer(val, delims, false);
List<URL> urls = new ArrayList<URL>();
List<URL> urls = new ArrayList<>();
while (tokenizer.hasMoreTokens())
{
urls.add(BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(new URL(tokenizer.nextToken())));
@ -113,7 +113,7 @@ public class Util
/* ------------------------------------------------------------ */
public static void setProperty(Dictionary<String,String> properties, String key, String value)
public static void setProperty(Dictionary<String,Object> properties, String key, Object value)
{
if (value != null)
{

View File

@ -38,10 +38,10 @@ public class DefaultBundleClassLoaderHelper implements BundleClassLoaderHelper
private static final Logger LOG = Log.getLogger(BundleClassLoaderHelper.class);
private static enum OSGiContainerType {EquinoxOld, EquinoxLuna, FelixOld, Felix403, Concierge};
private static OSGiContainerType osgiContainer;
private static Class Equinox_BundleHost_Class;
private static Class Equinox_EquinoxBundle_Class;
private static Class Felix_BundleImpl_Class;
private static Class Felix_BundleWiring_Class;
private static Class<?> Equinox_BundleHost_Class;
private static Class<?> Equinox_EquinoxBundle_Class;
private static Class<?> Felix_BundleImpl_Class;
private static Class<?> Felix_BundleWiring_Class;
//old equinox
private static Method Equinox_BundleHost_getBundleLoader_method;
private static Method Equinox_BundleLoader_createClassLoader_method;
@ -56,8 +56,8 @@ public class DefaultBundleClassLoaderHelper implements BundleClassLoaderHelper
private static Method Felix_BundleWiring_getClassLoader_Method;
// Concierge
private static Class Concierge_BundleImpl_Class;
private static Class Concierge_BundleWiring_Class;
private static Class<?> Concierge_BundleImpl_Class;
private static Class<?> Concierge_BundleWiring_Class;
private static Method Concierge_BundleImpl_Adapt_Method;
private static Method Concierge_BundleWiring_getClassLoader_Method;
@ -268,6 +268,7 @@ public class DefaultBundleClassLoaderHelper implements BundleClassLoaderHelper
* @param bundle
* @return
*/
@SuppressWarnings("unchecked")
private static ClassLoader internalGetFelixBundleClassLoader(Bundle bundle)
{

View File

@ -19,7 +19,6 @@
package org.eclipse.jetty.osgi.boot.utils.internal;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URI;
@ -88,7 +87,7 @@ public class DefaultFileLocatorHelper implements BundleFileLocatorHelper
* @return Its installation location as a file.
* @throws Exception if unable to get the bundle install location
*/
@Override
@SuppressWarnings("resource")
public File getBundleInstallLocation(Bundle bundle) throws Exception
{
// String installedBundles = System.getProperty("osgi.bundles");
@ -252,6 +251,7 @@ public class DefaultFileLocatorHelper implements BundleFileLocatorHelper
path = "/" + path;
}
String pattern = last != -1 && last < entryPath.length() - 2 ? entryPath.substring(last + 1) : entryPath;
@SuppressWarnings("unchecked")
Enumeration<URL> enUrls = bundle.findEntries(path, pattern, false);
return enUrls;
}
@ -277,7 +277,7 @@ public class DefaultFileLocatorHelper implements BundleFileLocatorHelper
if (jasperLocation.isDirectory())
{
// try to find the jar files inside this folder
ArrayList<File> urls = new ArrayList<File>();
ArrayList<File> urls = new ArrayList<>();
for (File f : jasperLocation.listFiles())
{
if (f.getName().endsWith(".jar") && f.isFile())
@ -332,10 +332,10 @@ public class DefaultFileLocatorHelper implements BundleFileLocatorHelper
conn.setDefaultUseCaches(Resource.getDefaultUseCaches());
if (BUNDLE_URL_CONNECTION_getLocalURL == null && match(conn.getClass().getName(), BUNDLE_URL_CONNECTION_CLASSES))
{
BUNDLE_URL_CONNECTION_getLocalURL = conn.getClass().getMethod("getLocalURL", null);
BUNDLE_URL_CONNECTION_getLocalURL = conn.getClass().getMethod("getLocalURL");
BUNDLE_URL_CONNECTION_getLocalURL.setAccessible(true);
}
if (BUNDLE_URL_CONNECTION_getLocalURL != null) { return (URL) BUNDLE_URL_CONNECTION_getLocalURL.invoke(conn, null); }
if (BUNDLE_URL_CONNECTION_getLocalURL != null) { return (URL) BUNDLE_URL_CONNECTION_getLocalURL.invoke(conn); }
}
return url;
}
@ -366,10 +366,10 @@ public class DefaultFileLocatorHelper implements BundleFileLocatorHelper
&&
match (conn.getClass().getName(), BUNDLE_URL_CONNECTION_CLASSES))
{
BUNDLE_URL_CONNECTION_getFileURL = conn.getClass().getMethod("getFileURL", null);
BUNDLE_URL_CONNECTION_getFileURL = conn.getClass().getMethod("getFileURL");
BUNDLE_URL_CONNECTION_getFileURL.setAccessible(true);
}
if (BUNDLE_URL_CONNECTION_getFileURL != null) { return (URL) BUNDLE_URL_CONNECTION_getFileURL.invoke(conn, null); }
if (BUNDLE_URL_CONNECTION_getFileURL != null) { return (URL) BUNDLE_URL_CONNECTION_getFileURL.invoke(conn); }
}
return url;

View File

@ -47,7 +47,7 @@ public class PackageAdminServiceTracker implements ServiceListener
{
private BundleContext _context;
private List<BundleActivator> _activatedFragments = new ArrayList<BundleActivator>();
private List<BundleActivator> _activatedFragments = new ArrayList<>();
private boolean _fragmentsWereActivated = false;
@ -154,7 +154,7 @@ public class PackageAdminServiceTracker implements ServiceListener
return null;
}
PackageAdmin admin = (PackageAdmin) _context.getService(sr);
LinkedHashMap<String, Bundle> deps = new LinkedHashMap<String, Bundle>();
LinkedHashMap<String, Bundle> deps = new LinkedHashMap<>();
collectFragmentsAndRequiredBundles(bundle, admin, deps, false);
return deps.values().toArray(new Bundle[deps.size()]);
}

View File

@ -81,8 +81,8 @@ public class TestJettyOSGiBootContextAsService
@Ignore
@Test
public void assertAllBundlesActiveOrResolved()
{
TestOSGiUtil.assertAllBundlesActiveOrResolved(bundleContext);

View File

@ -50,6 +50,7 @@ import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpHeaderValue;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.util.HttpCookieStore;
import org.eclipse.jetty.util.ProcessorUtils;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
@ -352,7 +353,7 @@ public abstract class AbstractProxyServlet extends HttpServlet
*/
protected HttpClient newHttpClient()
{
int selectors = Math.max(1, Runtime.getRuntime().availableProcessors() / 2);
int selectors = Math.max(1,ProcessorUtils.availableProcessors()/2);
String value = getServletConfig().getInitParameter("selectors");
if (value != null)
selectors = Integer.parseInt(value);

View File

@ -42,6 +42,7 @@ import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.util.ProcessorUtils;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
@ -149,7 +150,7 @@ public class ProxyServletLoadTest
startClient();
// Number of clients to simulate
int clientCount = Runtime.getRuntime().availableProcessors();
int clientCount = ProcessorUtils.availableProcessors();
// Latch for number of clients still active (used to terminate test)
final CountDownLatch activeClientLatch = new CountDownLatch(clientCount);

View File

@ -115,7 +115,7 @@ public class ValidUrlRule extends Rule
LOG.debug("{} {} {} {}", Character.charCount(codepoint), codepoint, block, Character.isISOControl(codepoint));
return (!Character.isISOControl(codepoint)) && block != null && block != Character.UnicodeBlock.SPECIALS;
return (!Character.isISOControl(codepoint)) && block != null && !Character.UnicodeBlock.SPECIALS.equals(block);
}
@Override

View File

@ -42,6 +42,7 @@ import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.ssl.SslConnection;
import org.eclipse.jetty.util.FutureCallback;
import org.eclipse.jetty.util.ProcessorUtils;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
@ -196,7 +197,7 @@ public abstract class AbstractConnector extends ContainerLifeCycle implements Co
for (ConnectionFactory factory:factories)
addConnectionFactory(factory);
int cores = Runtime.getRuntime().availableProcessors();
int cores = ProcessorUtils.availableProcessors();
if (acceptors < 0)
acceptors=Math.max(1, Math.min(4,cores/8));
if (acceptors > cores)

View File

@ -80,10 +80,10 @@ public class ConnectorStatistics extends AbstractLifeCycle implements Dumpable,
{
long msgsIn=connection.getMessagesIn();
long msgsOut=connection.getMessagesOut();
_messagesIn.set(msgsIn);
_messagesOut.set(msgsOut);
_messagesIn.record(msgsIn);
_messagesOut.record(msgsOut);
_connectionStats.decrement();
_connectionDurationStats.set(System.currentTimeMillis()-connection.getCreatedTimeStamp());
_connectionDurationStats.record(System.currentTimeMillis()-connection.getCreatedTimeStamp());
Sample sample=_samples.remove(connection);
if (sample!=null)

View File

@ -428,7 +428,10 @@ public class HttpChannelOverHttp extends HttpChannel implements HttpParser.Reque
if (LOG.isDebugEnabled())
LOG.debug("upgrade {} {}", this, _upgrade);
if (_upgrade != PREAMBLE_UPGRADE_H2C && (_connection == null || !_connection.contains("upgrade")))
@SuppressWarnings("ReferenceEquality")
boolean isUpgraded_H2C = (_upgrade == PREAMBLE_UPGRADE_H2C);
if (!isUpgraded_H2C && (_connection == null || !_connection.contains("upgrade")))
throw new BadMessageException(HttpStatus.BAD_REQUEST_400);
// Find the upgrade factory
@ -465,7 +468,7 @@ public class HttpChannelOverHttp extends HttpChannel implements HttpParser.Reque
// Send 101 if needed
try
{
if (_upgrade != PREAMBLE_UPGRADE_H2C)
if (!isUpgraded_H2C)
sendResponse(new MetaData.Response(HttpVersion.HTTP_1_1, HttpStatus.SWITCHING_PROTOCOLS_101, response101, 0), null, true);
}
catch (IOException e)

View File

@ -143,6 +143,18 @@ public class Request implements HttpServletRequest
private static final MultiMap<String> NO_PARAMS = new MultiMap<>();
/* ------------------------------------------------------------ */
/**
* Compare inputParameters to NO_PARAMS by Reference
* @param inputParameters The parameters to compare to NO_PARAMS
* @return True if the inputParameters reference is equal to NO_PARAMS otherwise False
*/
private static boolean isNoParams(MultiMap<String> inputParameters) {
@SuppressWarnings("ReferenceEquality")
boolean is_no_params = (inputParameters==NO_PARAMS);
return is_no_params;
}
/* ------------------------------------------------------------ */
/**
* Obtain the base {@link Request} instance of a {@link ServletRequest}, by
@ -397,9 +409,9 @@ public class Request implements HttpServletRequest
}
// Do parameters need to be combined?
if (_queryParameters==NO_PARAMS || _queryParameters.size()==0)
if (isNoParams(_queryParameters) || _queryParameters.size()==0)
_parameters=_contentParameters;
else if (_contentParameters==NO_PARAMS || _contentParameters.size()==0)
else if (isNoParams(_contentParameters) || _contentParameters.size()==0)
_parameters=_queryParameters;
else
{

View File

@ -452,16 +452,30 @@ public class ResponseWriter extends PrintWriter
}
@Override
public PrintWriter format(Locale l, String format, Object... args)
public PrintWriter format(Locale locale, String format, Object... args)
{
try
{
/* If the passed locale is null then
use any locale set on the response as the default. */
if(locale == null)
locale = _locale;
synchronized (lock)
{
isOpen();
if ((_formatter == null) || (_formatter.locale() != l))
_formatter = new Formatter(this, l);
_formatter.format(l, format, args);
if(_formatter == null)
{
_formatter = new Formatter(this, locale);
}
else if (!_formatter.locale().equals(locale))
{
_formatter = new Formatter(this, locale);
}
_formatter.format(locale, format, args);
}
}
catch (InterruptedIOException ex)

View File

@ -102,7 +102,7 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
final long elapsed = System.currentTimeMillis()-request.getTimeStamp();
long d=_requestStats.decrement();
_requestTimeStats.set(elapsed);
_requestTimeStats.record(elapsed);
updateResponse(request);
@ -184,7 +184,7 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
final long dispatched=now-start;
_dispatchedStats.decrement();
_dispatchedTimeStats.set(dispatched);
_dispatchedTimeStats.record(dispatched);
if (state.isSuspended())
{
@ -197,7 +197,7 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
else if (state.isInitial())
{
long d=_requestStats.decrement();
_requestTimeStats.set(dispatched);
_requestTimeStats.record(dispatched);
updateResponse(baseRequest);
// If we have no more dispatches, should we signal shutdown?

View File

@ -18,8 +18,6 @@
package org.eclipse.jetty.server.session;
import static java.lang.Math.round;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
@ -63,9 +61,11 @@ import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.statistic.CounterStatistic;
import org.eclipse.jetty.util.statistic.SampleStatistic;
import org.eclipse.jetty.util.thread.Locker.Lock;
import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
import org.eclipse.jetty.util.thread.Scheduler;
import org.eclipse.jetty.util.thread.Locker.Lock;
import static java.lang.Math.round;
/* ------------------------------------------------------------ */
/**
@ -1235,7 +1235,7 @@ public class SessionHandler extends ScopedHandler
if (session != null)
{
_sessionTimeStats.set(round((System.currentTimeMillis() - session.getSessionData().getCreated())/1000.0));
_sessionTimeStats.record(round((System.currentTimeMillis() - session.getSessionData().getCreated())/1000.0));
session.finishInvalidate();
}
}

View File

@ -63,6 +63,7 @@ import org.eclipse.jetty.server.session.Session;
import org.eclipse.jetty.server.session.SessionData;
import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.toolchain.test.AdvancedRunner;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.thread.Scheduler;
import org.eclipse.jetty.util.thread.TimerScheduler;
@ -112,10 +113,13 @@ public class ResponseTest
private Server _server;
private HttpChannel _channel;
private ByteBuffer _content = BufferUtil.allocate(16*1024);
@Before
public void init() throws Exception
{
BufferUtil.clear(_content);
_server = new Server();
Scheduler _scheduler = new TimerScheduler();
HttpConfiguration config = new HttpConfiguration();
@ -139,6 +143,12 @@ public class ResponseTest
@Override
public void send(MetaData.Response info, boolean head, ByteBuffer content, boolean lastContent, Callback callback)
{
if(BufferUtil.hasContent(content))
{
BufferUtil.append(_content, content);
}
if (_channelError==null)
callback.succeeded();
else
@ -172,6 +182,7 @@ public class ResponseTest
{
return false;
}
});
}
@ -364,6 +375,54 @@ public class ResponseTest
assertTrue(response.toString().indexOf("charset=utf-8") > 0);
}
@Test
public void testLocaleFormat() throws Exception
{
Response response = getResponse();
ContextHandler context = new ContextHandler();
context.addLocaleEncoding(Locale.ENGLISH.toString(), "ISO-8859-1");
context.addLocaleEncoding(Locale.ITALIAN.toString(), "ISO-8859-2");
response.getHttpChannel().getRequest().setContext(context.getServletContext());
response.setLocale(java.util.Locale.ITALIAN);
PrintWriter out = response.getWriter();
out.format("TestA1 %,.2f%n", 1234567.89);
out.format("TestA2 %,.2f%n", 1234567.89);
out.format((java.util.Locale)null,"TestB1 %,.2f%n", 1234567.89);
out.format((java.util.Locale)null,"TestB2 %,.2f%n", 1234567.89);
out.format(Locale.ENGLISH,"TestC1 %,.2f%n", 1234567.89);
out.format(Locale.ENGLISH,"TestC2 %,.2f%n", 1234567.89);
out.format(Locale.ITALIAN,"TestD1 %,.2f%n", 1234567.89);
out.format(Locale.ITALIAN,"TestD2 %,.2f%n", 1234567.89);
out.close();
/* Test A */
Assert.assertThat(BufferUtil.toString(_content),Matchers.containsString("TestA1 1.234.567,89"));
Assert.assertThat(BufferUtil.toString(_content),Matchers.containsString("TestA2 1.234.567,89"));
/* Test B */
Assert.assertThat(BufferUtil.toString(_content),Matchers.containsString("TestB1 1.234.567,89"));
Assert.assertThat(BufferUtil.toString(_content),Matchers.containsString("TestB2 1.234.567,89"));
/* Test C */
Assert.assertThat(BufferUtil.toString(_content),Matchers.containsString("TestC1 1,234,567.89"));
Assert.assertThat(BufferUtil.toString(_content),Matchers.containsString("TestC2 1,234,567.89"));
/* Test D */
Assert.assertThat(BufferUtil.toString(_content),Matchers.containsString("TestD1 1.234.567,89"));
Assert.assertThat(BufferUtil.toString(_content),Matchers.containsString("TestD2 1.234.567,89"));
}
@Test
public void testContentTypeCharacterEncoding() throws Exception
{

View File

@ -255,7 +255,7 @@ public class ServerConnectorTest
try (StacklessLogging stackless = new StacklessLogging(AbstractConnector.class))
{
AtomicLong spins = new AtomicLong();
ServerConnector connector = new ServerConnector(server)
ServerConnector connector = new ServerConnector(server,1,1)
{
@Override
public void accept(int acceptorID) throws IOException
@ -267,7 +267,7 @@ public class ServerConnectorTest
server.addConnector(connector);
server.start();
Thread.sleep(1000);
Thread.sleep(1500);
assertThat(spins.get(), Matchers.lessThan(5L));
}
finally

View File

@ -325,13 +325,21 @@ public class ThreadStarvationTest
byte buf[] = new byte[1024];
while((len = in.read(buf,0,buf.length)) != -1)
try
{
for(int x=0; x<len; x++)
while((len = in.read(buf,0,buf.length)) != -1)
{
if(buf[x] == '!') bodyCount++;
for(int x=0; x<len; x++)
{
if(buf[x] == '!') bodyCount++;
}
}
}
catch(Throwable th)
{
_server.dumpStdErr();
throw th;
}
return bodyCount;
}
});

View File

@ -514,7 +514,9 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
if ((_welcomeServlets || _welcomeExactServlets) && welcome_servlet==null)
{
MappedResource<ServletHolder> entry=_servletHandler.getMappedServlet(welcome_in_context);
if (entry!=null && entry.getResource()!=_defaultHolder &&
@SuppressWarnings("ReferenceEquality")
boolean isDefaultHolder = (entry.getResource()!=_defaultHolder);
if (entry!=null && isDefaultHolder &&
(_welcomeServlets || (_welcomeExactServlets && entry.getPathSpec().getDeclaration().equals(welcome_in_context))))
welcome_servlet=welcome_in_context;

View File

@ -1513,7 +1513,9 @@ public class ServletHandler extends ScopedHandler
boolean found = false;
for (ServletHolder s:_servlets)
{
if (s == holder)
@SuppressWarnings("ReferenceEquality")
boolean foundServletHolder = (s == holder);
if (foundServletHolder)
found = true;
}
return found;

View File

@ -54,7 +54,8 @@ import org.eclipse.jetty.util.log.Logger;
* <dt>allowedOrigins</dt>
* <dd>a comma separated list of origins that are
* allowed to access the resources. Default value is <b>*</b>, meaning all
* origins.
* origins. Note that using wild cards can result in security problems
* for requests identifying hosts that do not exist.
* <p>
* If an allowed origin contains one or more * characters (for example
* http://*.domain.com), then "*" characters are converted to ".*", "."

View File

@ -37,6 +37,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.HttpOutput;
import org.eclipse.jetty.util.ProcessorUtils;
/**
* A servlet that uses the Servlet 3.1 asynchronous IO API to server
@ -78,7 +79,7 @@ public class DataRateLimitedServlet extends HttpServlet
if (tmp!=null)
pauseNS=TimeUnit.MILLISECONDS.toNanos(Integer.parseInt(tmp));
tmp = getInitParameter("pool");
int pool=tmp==null?Runtime.getRuntime().availableProcessors():Integer.parseInt(tmp);
int pool=tmp==null?ProcessorUtils.availableProcessors():Integer.parseInt(tmp);
// Create and start a shared scheduler.
scheduler=new ScheduledThreadPoolExecutor(pool);

View File

@ -383,7 +383,7 @@ public class DoSFilter implements Filter
// or if we were woken up we insist or we fail.
Boolean throttled = (Boolean)request.getAttribute(__THROTTLED);
long throttleMs = getThrottleMs();
if (throttled != Boolean.TRUE && throttleMs > 0)
if (!Boolean.TRUE.equals(throttled) && throttleMs > 0)
{
int priority = getPriority(request, tracker);
request.setAttribute(__THROTTLED, Boolean.TRUE);
@ -401,7 +401,7 @@ public class DoSFilter implements Filter
}
Boolean resumed = (Boolean)request.getAttribute(_resumed);
if (resumed == Boolean.TRUE)
if (Boolean.TRUE.equals(resumed))
{
// We were resumed, we wait for the next pass.
_passes.acquire();
@ -446,7 +446,7 @@ public class DoSFilter implements Filter
{
ServletRequest candidate = asyncContext.getRequest();
Boolean suspended = (Boolean)candidate.getAttribute(_suspended);
if (suspended == Boolean.TRUE)
if (Boolean.TRUE.equals(suspended))
{
if (LOG.isDebugEnabled())
LOG.debug("Resuming {}", request);

View File

@ -173,7 +173,7 @@ public class QoSFilter implements Filter
{
request.setAttribute(_suspended, Boolean.FALSE);
Boolean resumed = (Boolean)request.getAttribute(_resumed);
if (resumed == Boolean.TRUE)
if (Boolean.TRUE.equals(resumed))
{
_passes.acquire();
accepted = true;
@ -224,7 +224,7 @@ public class QoSFilter implements Filter
{
ServletRequest candidate = asyncContext.getRequest();
Boolean suspended = (Boolean)candidate.getAttribute(_suspended);
if (suspended == Boolean.TRUE)
if (Boolean.TRUE.equals(suspended))
{
candidate.setAttribute(_resumed, Boolean.TRUE);
asyncContext.dispatch();

View File

@ -39,7 +39,6 @@ import java.net.SocketTimeoutException;
import java.nio.file.Path;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import org.eclipse.jetty.start.Props.Prop;
import org.eclipse.jetty.start.config.CommandLineConfigSource;
@ -295,18 +294,18 @@ public class Main
args.parse(baseHome.getConfigSources());
Props props = baseHome.getConfigSources().getProps();
Props.Prop home = props.getProp(BaseHome.JETTY_HOME);
Prop home = props.getProp(BaseHome.JETTY_HOME);
if (!args.getProperties().containsKey(BaseHome.JETTY_HOME))
args.getProperties().setProperty(home);
args.getProperties().setProperty(BaseHome.JETTY_HOME+".uri",
normalizeURI(baseHome.getHomePath().toUri().toString()),
home.origin);
Props.Prop base = props.getProp(BaseHome.JETTY_BASE);
home.source);
Prop base = props.getProp(BaseHome.JETTY_BASE);
if (!args.getProperties().containsKey(BaseHome.JETTY_BASE))
args.getProperties().setProperty(base);
args.getProperties().setProperty(BaseHome.JETTY_BASE+".uri",
normalizeURI(baseHome.getBasePath().toUri().toString()),
base.origin);
base.source);
// ------------------------------------------------------------
// 3) Module Registration
@ -426,25 +425,8 @@ public class Main
{
for (ConfigSource config : baseHome.getConfigSources())
{
System.out.printf("ConfigSource %s%n",config.getId());
for (StartIni ini : config.getStartInis())
{
for (String line : ini.getAllLines())
{
Matcher m = Module.SET_PROPERTY.matcher(line);
if (m.matches() && m.groupCount()==3)
{
String name = m.group(2);
String value = m.group(3);
Prop p = args.getProperties().getProp(name);
if (p!=null && ("#".equals(m.group(1)) || !value.equals(p.value)))
{
ini.update(baseHome,args.getProperties());
break;
}
}
}
}
ini.update(baseHome,args.getProperties());
}
}
@ -512,10 +494,10 @@ public class Main
private void doStop(StartArgs args)
{
Props.Prop stopHostProp = args.getProperties().getProp("STOP.HOST", true);
Props.Prop stopPortProp = args.getProperties().getProp("STOP.PORT", true);
Props.Prop stopKeyProp = args.getProperties().getProp("STOP.KEY", true);
Props.Prop stopWaitProp = args.getProperties().getProp("STOP.WAIT", true);
Prop stopHostProp = args.getProperties().getProp("STOP.HOST", true);
Prop stopPortProp = args.getProperties().getProp("STOP.PORT", true);
Prop stopKeyProp = args.getProperties().getProp("STOP.KEY", true);
Prop stopWaitProp = args.getProperties().getProp("STOP.WAIT", true);
String stopHost = "127.0.0.1";
int stopPort = -1;

View File

@ -37,7 +37,6 @@ import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.eclipse.jetty.start.Props.Prop;
import org.eclipse.jetty.start.config.CommandLineConfigSource;
/**
* Represents a Module metadata, as defined in Jetty.
@ -527,9 +526,12 @@ public class Module implements Comparable<Module>
if (m.matches() && m.groupCount()==3)
{
String name = m.group(2);
String value = m.group(3);
Prop p = props.getProp(name);
if (p!=null && p.origin.startsWith(CommandLineConfigSource.ORIGIN_CMD_LINE))
if (p!=null && (p.source==null || !p.source.endsWith("?=")) && ("#".equals(m.group(1)) || !value.equals(p.value)))
{
System.err.printf("%s == %s :: %s%n",name,value,p.source);
StartLog.info("%-15s property set %s=%s",this._name,name,p.value);
out.printf("%s=%s%n",name,p.value);
}

View File

@ -305,7 +305,7 @@ public class Modules implements Iterable<Module>
{
for (Module p:providers)
{
if (p!=module && p.isEnabled())
if (!p.equals(module) && p.isEnabled())
{
// If the already enabled module is transitive and this enable is not
if (p.isTransitive() && !transitive)
@ -364,8 +364,8 @@ public class Modules implements Iterable<Module>
}
// If a provider is already enabled, then add a transitive enable
if (providers.stream().filter(Module::isEnabled).count()!=0)
providers.stream().filter(m->m.isEnabled()&&m!=module).forEach(m->enable(newlyEnabled,m,"transitive provider of "+dependsOn+" for "+module.getName(),true));
if (providers.stream().filter(Module::isEnabled).count()>0)
providers.stream().filter(m->m.isEnabled()&&!m.equals(module)).forEach(m->enable(newlyEnabled,m,"transitive provider of "+dependsOn+" for "+module.getName(),true));
else
{
// Is there an obvious default?

View File

@ -48,20 +48,13 @@ public final class Props implements Iterable<Prop>
{
public String key;
public String value;
public String origin;
public Prop overrides;
public String source;
public Prop(String key, String value, String origin)
public Prop(String key, String value, String source)
{
this.key = key;
this.value = value;
this.origin = origin;
}
public Prop(String key, String value, String origin, Prop overrides)
{
this(key,value,origin);
this.overrides = overrides;
this.source = source;
}
@Override
@ -72,15 +65,12 @@ public final class Props implements Iterable<Prop>
builder.append(key);
builder.append(", value=");
builder.append(value);
builder.append(", origin=");
builder.append(origin);
builder.append(", overrides=");
builder.append(overrides);
builder.append(", source=");
builder.append(source);
builder.append("]");
return builder.toString();
}
}
public static final String ORIGIN_SYSPROP = "<system-property>";
public static String getValue(String arg)
@ -342,16 +332,7 @@ public final class Props implements Iterable<Prop>
public void setProperty(String key, String value, String origin)
{
Prop prop = props.get(key);
if (prop == null)
{
prop = new Prop(key,value,origin);
}
else
{
prop = new Prop(key,value,origin,prop);
}
props.put(key,prop);
props.put(key,new Prop(key,value,origin));
}
public int size()

View File

@ -35,7 +35,6 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.function.Function;
import org.eclipse.jetty.start.Props.Prop;
import org.eclipse.jetty.start.config.ConfigSource;
@ -123,9 +122,6 @@ public class StartArgs
/** Map of enabled modules to the source of where that activation occurred */
Map<String, List<String>> sources = new HashMap<>();
/** Map of properties to where that property was declared */
private Map<String, String> propertySource = new HashMap<>();
/** List of all active [files] sections from enabled modules */
private List<FileArg> files = new ArrayList<>();
@ -148,7 +144,7 @@ public class StartArgs
private List<Path> propertyFiles = new ArrayList<>();
private Props properties = new Props();
private Set<String> systemPropertyKeys = new HashSet<>();
private Map<String,String> systemPropertySource = new HashMap<>();
private List<String> rawLibs = new ArrayList<>();
// jetty.base - build out commands
@ -205,12 +201,6 @@ public class StartArgs
}
}
public void addSystemProperty(String key, String value)
{
this.systemPropertyKeys.add(key);
System.setProperty(key,value);
}
private void addUniqueXmlFile(String xmlRef, Path xmlfile) throws IOException
{
if (!FS.canReadFile(xmlfile))
@ -337,7 +327,7 @@ public class StartArgs
List<String> sortedKeys = new ArrayList<>();
for (Prop prop : properties)
{
if (prop.origin.equals(Props.ORIGIN_SYSPROP))
if (prop.source.equals(Props.ORIGIN_SYSPROP))
{
continue; // skip
}
@ -369,16 +359,7 @@ public class StartArgs
{
System.out.printf(" %s = %s%n",key,prop.value);
if (StartLog.isDebugEnabled())
{
System.out.printf(" origin: %s%n",prop.origin);
while (prop.overrides != null)
{
prop = prop.overrides;
System.out.printf(" (overrides)%n");
System.out.printf(" %s = %s%n",key,prop.value);
System.out.printf(" origin: %s%n",prop.origin);
}
}
System.out.printf(" origin: %s%n",prop.source);
}
}
@ -388,26 +369,25 @@ public class StartArgs
System.out.println("System Properties:");
System.out.println("------------------");
if (systemPropertyKeys.isEmpty())
if (systemPropertySource.keySet().isEmpty())
{
System.out.println(" (no system properties specified)");
return;
}
List<String> sortedKeys = new ArrayList<>();
sortedKeys.addAll(systemPropertyKeys);
sortedKeys.addAll(systemPropertySource.keySet());
Collections.sort(sortedKeys);
for (String key : sortedKeys)
{
String value = System.getProperty(key);
System.out.printf(" %s = %s%n",key,value);
}
dumpSystemProperty(key);
}
private void dumpSystemProperty(String key)
{
System.out.printf(" %s = %s%n",key,System.getProperty(key));
String value = System.getProperty(key);
String source = systemPropertySource.get(key);
System.out.printf(" %s = %s (%s)%n",key,value,source);
}
/**
@ -418,20 +398,20 @@ public class StartArgs
*/
private void ensureSystemPropertySet(String key)
{
if (systemPropertyKeys.contains(key))
if (systemPropertySource.containsKey(key))
{
return; // done
}
if (properties.containsKey(key))
{
String val = properties.expand(properties.getString(key));
if (val == null)
{
return; // no value to set
}
Prop prop = properties.getProp(key);
if (prop==null)
return; // no value set;
String val = properties.expand(prop.value);
// setup system property
systemPropertyKeys.add(key);
systemPropertySource.put(key,"property:"+prop.source);
System.setProperty(key,val);
}
}
@ -446,7 +426,7 @@ public class StartArgs
{
StartLog.debug("Expanding System Properties");
for (String key : systemPropertyKeys)
for (String key : systemPropertySource.keySet())
{
String value = properties.getString(key);
if (value!=null)
@ -588,11 +568,8 @@ public class StartArgs
String key = assign[0];
String value = assign.length==1?"":assign[1];
Property p = processProperty(key,value,"modules",k->{return System.getProperty(k);});
if (p!=null)
{
cmd.addRawArg("-D"+p.key+"="+getProperties().expand(p.value));
}
Prop p = processSystemProperty(key,value,null);
cmd.addRawArg("-D"+p.key+"="+getProperties().expand(p.value));
}
else
{
@ -601,7 +578,7 @@ public class StartArgs
}
// System Properties
for (String propKey : systemPropertyKeys)
for (String propKey : systemPropertySource.keySet())
{
String value = System.getProperty(propKey);
cmd.addEqualsArg("-D" + propKey,value);
@ -737,7 +714,7 @@ public class StartArgs
public boolean hasSystemProperties()
{
for (String key : systemPropertyKeys)
for (String key : systemPropertySource.keySet())
{
// ignored keys
if ("jetty.home".equals(key) || "jetty.base".equals(key) || "main.class".equals(key))
@ -1096,13 +1073,10 @@ public class StartArgs
String key = assign[0];
String value = assign.length==1?"":assign[1];
Property p = processProperty(key,value,source,k->{return System.getProperty(k);});
if (p!=null)
{
systemPropertyKeys.add(p.key);
setProperty(p.key,p.value,p.source);
System.setProperty(p.key,p.value);
}
Prop p = processSystemProperty(key,value,source);
systemPropertySource.put(p.key,p.source);
setProperty(p.key,p.value,p.source);
System.setProperty(p.key,p.value);
return;
}
@ -1124,11 +1098,8 @@ public class StartArgs
String key = arg.substring(0,equals);
String value = arg.substring(equals + 1);
Property p = processProperty(key,value,source,k->{return getProperties().getString(k);});
if (p!=null)
{
setProperty(p.key,p.value,p.source);
}
processAndSetProperty(key,value,source);
return;
}
@ -1157,41 +1128,69 @@ public class StartArgs
throw new UsageException(UsageException.ERR_BAD_ARG,"Unrecognized argument: \"%s\" in %s",arg,source);
}
protected Property processProperty(String key,String value,String source, Function<String, String> getter)
protected Prop processSystemProperty(String key, String value, String source)
{
if (key.endsWith("+"))
{
key = key.substring(0,key.length() - 1);
String orig = getter.apply(key);
String orig = System.getProperty(key);
if (orig == null || orig.isEmpty())
{
if (value.startsWith(","))
value = value.substring(1);
}
else
{
value = orig + value;
if (source!=null && systemPropertySource.containsKey(key))
source = systemPropertySource.get(key) + "," + source;
}
}
else if (key.endsWith("?"))
{
key = key.substring(0,key.length() - 1);
String preset = System.getProperty(key);
if (preset!=null)
{
value = preset;
source = systemPropertySource.get(key);
}
else if (source!=null)
source = source+"?=";
}
return new Prop(key, value, source);
}
protected void processAndSetProperty(String key,String value,String source)
{
if (key.endsWith("+"))
{
key = key.substring(0,key.length() - 1);
Prop orig = getProperties().getProp(key);
if (orig == null)
{
if (value.startsWith(","))
value = value.substring(1);
}
else
{
value = orig + value;
source = propertySource.get(key) + "," + source;
value = orig.value + value;
source = orig.source + "," + source;
}
}
if (key.endsWith("?"))
else if (key.endsWith("?"))
{
key = key.substring(0,key.length() - 1);
String preset = getter.apply(key);
Prop preset = getProperties().getProp(key);
if (preset!=null)
{
return;
if (source!=null)
source = source+"?=";
value = preset;
}
}
else if (propertySource.containsKey(key))
{
if (!propertySource.get(key).endsWith("[ini]"))
StartLog.warn("Property %s in %s already set in %s",key,source,propertySource.get(key));
propertySource.put(key,source);
}
return new Property(key,value,source);
setProperty(key,value,source);
}
private void enableModules(String source, List<String> moduleNames)
@ -1303,22 +1302,4 @@ public class StartArgs
return builder.toString();
}
static class Property
{
String key;
String value;
String source;
public Property(String key, String value, String source)
{
this.key = key;
this.value = value;
this.source = source;
}
@Override
public String toString()
{
return String.format("%s=%s(%s)",key,value,source);
}
}
}

View File

@ -92,7 +92,9 @@ public class StartIni extends TextFile
update = update.substring(0,update.lastIndexOf("."));
String source = baseHome.toShortForm(getFile());
try (PrintWriter writer = new PrintWriter(Files.newBufferedWriter(getFile(),StandardCharsets.UTF_8,StandardOpenOption.TRUNCATE_EXISTING,StandardOpenOption.CREATE)))
PrintWriter writer = null;
try
{
for (String line : getAllLines())
{
@ -102,23 +104,42 @@ public class StartIni extends TextFile
String name = m.group(2);
String value = m.group(3);
Prop p = props.getProp(name);
if (p!=null && ("#".equals(m.group(1)) || !value.equals(p.value)))
if (p!=null && (p.source==null || !p.source.endsWith("?=")) && ("#".equals(m.group(1)) || !value.equals(p.value)))
{
if (writer==null)
{
writer = new PrintWriter(Files.newBufferedWriter(getFile(),StandardCharsets.UTF_8,StandardOpenOption.TRUNCATE_EXISTING,StandardOpenOption.CREATE));
for (String l : getAllLines())
{
if (line.equals(l))
break;
writer.println(l);
}
}
StartLog.info("%-15s property updated %s=%s",update,name,p.value);
writer.printf("%s=%s%n",name,p.value);
}
else
else if (writer!=null)
{
writer.println(line);
}
}
else
else if (writer!=null)
{
writer.println(line);
}
}
}
finally
{
if (writer!=null)
{
StartLog.info("%-15s updated %s",update,source);
writer.close();
}
}
StartLog.info("%-15s updated %s",update,source);
}
}

View File

@ -142,7 +142,7 @@ public class ConfigurationAssert
"jetty.home.uri".equals(name) ||
"jetty.base.uri".equals(name) ||
"user.dir".equals(name) ||
prop.origin.equals(Props.ORIGIN_SYSPROP) ||
prop.source.equals(Props.ORIGIN_SYSPROP) ||
name.startsWith("java."))
{
// strip these out from assertion, to make assertions easier.

View File

@ -20,7 +20,6 @@ package org.eclipse.jetty.start;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
@ -36,7 +35,7 @@ public class PropsTest
assertThat(prefix,prop,notNullValue());
assertThat(prefix + ".key",prop.key,is(expectedKey));
assertThat(prefix + ".value",prop.value,is(expectedValue));
assertThat(prefix + ".origin",prop.origin,is(expectedOrigin));
assertThat(prefix + ".origin",prop.source,is(expectedOrigin));
}
@Test
@ -49,7 +48,6 @@ public class PropsTest
Prop prop = props.getProp("java.io.tmpdir");
assertProp("System Prop",prop,"java.io.tmpdir",expected,Props.ORIGIN_SYSPROP);
assertThat("System Prop.overrides",prop.overrides,nullValue());
}
@Test
@ -63,25 +61,6 @@ public class PropsTest
Prop prop = props.getProp("name");
assertProp(prefix,prop,"name","jetty",FROM_TEST);
assertThat(prefix + ".overrides",prop.overrides,nullValue());
}
@Test
public void testOverride()
{
Props props = new Props();
props.setProperty("name","jetty",FROM_TEST);
props.setProperty("name","altjetty","(Alt-Jetty)");
String prefix = "Overriden";
assertThat(prefix,props.getString("name"),is("altjetty"));
Prop prop = props.getProp("name");
assertProp(prefix,prop,"name","altjetty","(Alt-Jetty)");
Prop older = prop.overrides;
assertThat(prefix + ".overrides",older,notNullValue());
assertProp(prefix + ".overridden",older,"name","jetty",FROM_TEST);
assertThat(prefix + ".overridden",older.overrides,nullValue());
}
@Test

Some files were not shown because too many files have changed in this diff Show More