com.yahoo.jdisc.core.ContainerSnapshot Maven / Gradle / Ivy
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.jdisc.core;
import com.google.inject.Key;
import com.yahoo.jdisc.AbstractResource;
import com.yahoo.jdisc.Container;
import com.yahoo.jdisc.Request;
import com.yahoo.jdisc.ResourceReference;
import com.yahoo.jdisc.application.BindingMatch;
import com.yahoo.jdisc.application.BindingSet;
import com.yahoo.jdisc.handler.ContentChannel;
import com.yahoo.jdisc.handler.NullContent;
import com.yahoo.jdisc.handler.RequestHandler;
import com.yahoo.jdisc.handler.ResponseHandler;
import java.util.Objects;
/**
* @author Simon Thoresen Hult
*/
class ContainerSnapshot extends AbstractResource implements Container {
private final TimeoutManagerImpl timeoutMgr;
private final ActiveContainer container;
private final ResourceReference containerReference;
private final BindingSet serverBindings;
private final BindingSet clientBindings;
ContainerSnapshot(ActiveContainer container, BindingSet serverBindings,
BindingSet clientBindings)
{
this.timeoutMgr = container.timeoutManager();
this.container = container;
this.serverBindings = serverBindings;
this.clientBindings = clientBindings;
this.containerReference = container.refer();
}
@Override
public T getInstance(Key key) {
return container.guiceInjector().getInstance(key);
}
@Override
public T getInstance(Class type) {
return container.guiceInjector().getInstance(type);
}
@Override
public RequestHandler resolveHandler(Request request) {
BindingMatch match = request.isServerRequest() ? serverBindings.match(request.getUri())
: clientBindings.match(request.getUri());
if (match == null) {
return null;
}
request.setBindingMatch(match);
RequestHandler ret = new NullContentRequestHandler(match.target());
if (request.getTimeoutManager() == null) {
ret = timeoutMgr.manageHandler(ret);
}
return ret;
}
@Override
protected void destroy() {
containerReference.close();
}
@Override
public long currentTimeMillis() {
return timeoutMgr.timer().currentTimeMillis();
}
private static class NullContentRequestHandler implements RequestHandler {
final RequestHandler delegate;
NullContentRequestHandler(RequestHandler delegate) {
Objects.requireNonNull(delegate, "delegate");
this.delegate = delegate;
}
@Override
public ContentChannel handleRequest(Request request, ResponseHandler responseHandler) {
ContentChannel content = delegate.handleRequest(request, responseHandler);
if (content == null) {
content = NullContent.INSTANCE;
}
return content;
}
@Override
public void handleTimeout(Request request, ResponseHandler responseHandler) {
delegate.handleTimeout(request, responseHandler);
}
@Override
public ResourceReference refer() {
return delegate.refer();
}
@Override
public void release() {
delegate.release();
}
@Override
public String toString() {
return delegate.toString();
}
}
}