package com.firefly.server.http2.router.impl; import com.firefly.server.http2.SimpleRequest; import com.firefly.server.http2.SimpleResponse; import com.firefly.server.http2.router.RouterManager; import com.firefly.server.http2.router.RoutingContext; import com.firefly.server.http2.router.handler.template.TemplateHandlerSPILoader; import com.firefly.server.http2.router.spi.HTTPBodyHandlerSPI; import com.firefly.server.http2.router.spi.HTTPSessionHandlerSPI; import com.firefly.server.http2.router.spi.TemplateHandlerSPI; import com.firefly.utils.function.Action1; import com.firefly.utils.json.JsonArray; import com.firefly.utils.json.JsonObject; import javax.servlet.http.HttpSession; import javax.servlet.http.Part; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.NavigableSet; import java.util.concurrent.ConcurrentHashMap; /** * @author Pengtao Qiu */ public class RoutingContextImpl implements RoutingContext { private final SimpleRequest request; private final NavigableSet<RouterManager.RouterMatchResult> routers; private volatile RouterManager.RouterMatchResult current; private volatile HTTPBodyHandlerSPI httpBodyHandlerSPI; private volatile HTTPSessionHandlerSPI httpSessionHandlerSPI; private final TemplateHandlerSPI templateHandlerSPI = TemplateHandlerSPILoader.getInstance().getTemplateHandlerSPI(); private volatile boolean asynchronousRead; public RoutingContextImpl(SimpleRequest request, NavigableSet<RouterManager.RouterMatchResult> routers) { this.request = request; this.routers = routers; } @Override public Object getAttribute(String key) { return request.get(key); } @Override public Object setAttribute(String key, Object value) { return request.put(key, value); } @Override public Object removeAttribute(String key) { return request.remove(key); } @Override public ConcurrentHashMap<String, Object> getAttributes() { return request.getAttributes(); } @Override public SimpleResponse getResponse() { return request.getResponse(); } @Override public SimpleResponse getAsyncResponse() { return request.getAsyncResponse(); } @Override public SimpleRequest getRequest() { return request; } @Override public String getRouterParameter(String name) { return current.getParameters().get(name); } @Override public RoutingContext content(Action1<ByteBuffer> content) { request.content(content); asynchronousRead = true; return this; } @Override public RoutingContext contentComplete(Action1<SimpleRequest> contentComplete) { request.contentComplete(contentComplete); asynchronousRead = true; return this; } @Override public RoutingContext messageComplete(Action1<SimpleRequest> messageComplete) { request.messageComplete(messageComplete); asynchronousRead = true; return this; } @Override public boolean isAsynchronousRead() { return asynchronousRead; } @Override public boolean next() { current = routers.pollFirst(); if (current != null) { ((RouterImpl) current.getRouter()).getHandler().handle(this); return true; } else { return false; } } @Override public boolean hasNext() { return !routers.isEmpty(); } @Override public void close() throws IOException { request.getResponse().close(); } @Override public String getParameter(String name) { if (httpBodyHandlerSPI == null) { return null; } else { return httpBodyHandlerSPI.getParameter(name); } } @Override public List<String> getParameterValues(String name) { if (httpBodyHandlerSPI == null) { return null; } else { return httpBodyHandlerSPI.getParameterValues(name); } } @Override public Map<String, List<String>> getParameterMap() { if (httpBodyHandlerSPI == null) { return null; } else { return httpBodyHandlerSPI.getParameterMap(); } } @Override public Collection<Part> getParts() { if (httpBodyHandlerSPI == null) { return null; } else { return httpBodyHandlerSPI.getParts(); } } @Override public Part getPart(String name) { if (httpBodyHandlerSPI == null) { return null; } else { return httpBodyHandlerSPI.getPart(name); } } @Override public InputStream getInputStream() { if (httpBodyHandlerSPI == null) { return null; } else { return httpBodyHandlerSPI.getInputStream(); } } @Override public BufferedReader getBufferedReader() { if (httpBodyHandlerSPI == null) { return null; } else { return httpBodyHandlerSPI.getBufferedReader(); } } @Override public String getStringBody(String charset) { if (httpBodyHandlerSPI == null) { return request.getStringBody(charset); } else { return httpBodyHandlerSPI.getStringBody(charset); } } @Override public String getStringBody() { if (httpBodyHandlerSPI == null) { return request.getStringBody(); } else { return httpBodyHandlerSPI.getStringBody(); } } @Override public <T> T getJsonBody(Class<T> clazz) { if (httpBodyHandlerSPI == null) { return request.getJsonBody(clazz); } else { return httpBodyHandlerSPI.getJsonBody(clazz); } } @Override public JsonObject getJsonObjectBody() { if (httpBodyHandlerSPI == null) { return request.getJsonObjectBody(); } else { return httpBodyHandlerSPI.getJsonObjectBody(); } } @Override public JsonArray getJsonArrayBody() { if (httpBodyHandlerSPI == null) { return request.getJsonArrayBody(); } else { return httpBodyHandlerSPI.getJsonArrayBody(); } } public void setHTTPBodyHandlerSPI(HTTPBodyHandlerSPI httpBodyHandlerSPI) { this.httpBodyHandlerSPI = httpBodyHandlerSPI; } @Override public HttpSession getSession() { if (httpSessionHandlerSPI == null) { return null; } else { return httpSessionHandlerSPI.getSession(); } } @Override public HttpSession getSession(boolean create) { if (httpSessionHandlerSPI == null) { return null; } else { return httpSessionHandlerSPI.getSession(create); } } @Override public boolean isRequestedSessionIdFromURL() { return httpSessionHandlerSPI != null && httpSessionHandlerSPI.isRequestedSessionIdFromURL(); } @Override public boolean isRequestedSessionIdFromCookie() { return httpSessionHandlerSPI != null && httpSessionHandlerSPI.isRequestedSessionIdFromCookie(); } @Override public boolean isRequestedSessionIdValid() { return httpSessionHandlerSPI != null && httpSessionHandlerSPI.isRequestedSessionIdValid(); } @Override public String getRequestedSessionId() { if (httpSessionHandlerSPI == null) { return null; } else { return httpSessionHandlerSPI.getRequestedSessionId(); } } public void setHTTPSessionHandlerSPI(HTTPSessionHandlerSPI httpSessionHandlerSPI) { this.httpSessionHandlerSPI = httpSessionHandlerSPI; } @Override public void renderTemplate(String resourceName, Object scope) { templateHandlerSPI.renderTemplate(this, resourceName, scope); } @Override public void renderTemplate(String resourceName, Object[] scopes) { templateHandlerSPI.renderTemplate(this, resourceName, scopes); } @Override public void renderTemplate(String resourceName, List<Object> scopes) { templateHandlerSPI.renderTemplate(this, resourceName, scopes); } }