From 1df5f884b1fc6335a868e06286447160b99f50c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Prante?= Date: Mon, 20 Mar 2023 17:07:18 +0100 Subject: [PATCH] add session name, fix netty request body retain, fix static suffixes, log throwables in the router dispatch --- .../application/web/WebApplication.java | 10 ++--- .../http/server/netty/HttpRequestBuilder.java | 7 ++-- .../xbib/net/http/server/BaseApplication.java | 29 ++++++++++---- .../http/server/BaseApplicationBuilder.java | 39 +++++++------------ .../resource/AbstractResourceHandler.java | 3 +- .../server/resource/HtmlTemplateResource.java | 7 +++- .../net/http/server/session/BaseSession.java | 10 +++++ .../xbib/net/http/server/session/Session.java | 2 + .../session/file/FileJsonSessionCodec.java | 13 +++++-- .../server/session/jdbc/JdbcSessionCodec.java | 10 +++-- .../memory/MemoryPropertiesSessionCodec.java | 16 +++++--- .../util/BlockingThreadPoolExecutor.java | 5 ++- .../groovy/DefaultMarkupTemplate.java | 30 ++++++++------ 13 files changed, 108 insertions(+), 73 deletions(-) diff --git a/net-http-server-application-web/src/main/java/org/xbib/net/http/server/application/web/WebApplication.java b/net-http-server-application-web/src/main/java/org/xbib/net/http/server/application/web/WebApplication.java index a3f237b..d946a41 100644 --- a/net-http-server-application-web/src/main/java/org/xbib/net/http/server/application/web/WebApplication.java +++ b/net-http-server-application-web/src/main/java/org/xbib/net/http/server/application/web/WebApplication.java @@ -10,15 +10,11 @@ import org.xbib.net.http.server.session.IncomingSessionHandler; import org.xbib.net.http.server.session.OutgoingSessionHandler; import org.xbib.net.http.server.session.Session; import org.xbib.net.http.server.session.file.FileJsonSessionCodec; -import org.xbib.settings.Settings; public class WebApplication extends BaseApplication { - private final WebApplicationBuilder builder; - protected WebApplication(WebApplicationBuilder builder) { super(builder); - this.builder = builder; } public static WebApplicationBuilder builder() { @@ -30,7 +26,7 @@ public class WebApplication extends BaseApplication { } protected Codec buildSessionCodec(HttpServerContext httpServerContext) { - return new FileJsonSessionCodec(this, 1024, Duration.ofDays(1), + return new FileJsonSessionCodec(sessionName, this, 1024, Duration.ofDays(1), Paths.get("/var/tmp/session")); } @@ -40,7 +36,7 @@ public class WebApplication extends BaseApplication { return new IncomingSessionHandler( getSecret(), "HmacSHA1", - "SESSION", + sessionName, sessionCodec, getStaticFileSuffixes(), "user_id", @@ -53,7 +49,7 @@ public class WebApplication extends BaseApplication { return new OutgoingSessionHandler( getSecret(), "HmacSHA1", - "SESSION", + sessionName, Duration.ofDays(1), sessionCodec, getStaticFileSuffixes(), diff --git a/net-http-server-netty/src/main/java/org/xbib/net/http/server/netty/HttpRequestBuilder.java b/net-http-server-netty/src/main/java/org/xbib/net/http/server/netty/HttpRequestBuilder.java index 6f8143b..9fdab43 100644 --- a/net-http-server-netty/src/main/java/org/xbib/net/http/server/netty/HttpRequestBuilder.java +++ b/net-http-server-netty/src/main/java/org/xbib/net/http/server/netty/HttpRequestBuilder.java @@ -15,16 +15,17 @@ import java.nio.charset.Charset; public class HttpRequestBuilder extends BaseHttpRequestBuilder { - FullHttpRequest fullHttpRequest; + protected FullHttpRequest fullHttpRequest; - ByteBuffer byteBuffer; + protected ByteBuffer byteBuffer; protected HttpRequestBuilder() { } public HttpRequestBuilder setFullHttpRequest(FullHttpRequest fullHttpRequest) { if (fullHttpRequest != null) { - this.fullHttpRequest = fullHttpRequest; + // retain request so we can read the body later without refCnt=0 error + this.fullHttpRequest = fullHttpRequest.retain(); setVersion(HttpVersion.valueOf(fullHttpRequest.protocolVersion().text())); setMethod(HttpMethod.valueOf(fullHttpRequest.method().name())); setRequestURI(fullHttpRequest.uri()); diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/BaseApplication.java b/net-http-server/src/main/java/org/xbib/net/http/server/BaseApplication.java index 4aeac31..02ebdce 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/BaseApplication.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/BaseApplication.java @@ -41,6 +41,8 @@ public class BaseApplication implements Application { private final HttpRequestValidator httpRequestValidator; + protected final String sessionName; + private final HttpHandler incomingCookieHandler; private final HttpHandler outgoingCookieHandler; @@ -59,6 +61,7 @@ public class BaseApplication implements Application { new NamedThreadFactory("org-xbib-net-http-server-application")); this.executor.setRejectedExecutionHandler((runnable, threadPoolExecutor) -> logger.log(Level.SEVERE, "rejected " + runnable + " for thread pool executor = " + threadPoolExecutor)); + this.sessionName = getSettings().get("session.name", "SESS"); this.httpRequestValidator = buildRequestValidator(); this.incomingCookieHandler = buildIncomingCookieHandler(); this.outgoingCookieHandler = buildOutgoingCookieHandler(); @@ -121,7 +124,14 @@ public class BaseApplication implements Application { @Override public void dispatch(HttpRequestBuilder requestBuilder, HttpResponseBuilder responseBuilder) { - Future future = executor.submit(() -> getRouter().route(requestBuilder, responseBuilder)); + Future future = executor.submit(() -> { + try { + getRouter().route(requestBuilder, responseBuilder); + } catch (Throwable t) { + logger.log(Level.SEVERE, t.getMessage(), t); + throw t; + } + }); logger.log(Level.FINE, "dispatching " + future); } @@ -132,7 +142,12 @@ public class BaseApplication implements Application { Future future = executor.submit(() -> { HttpServerContext httpServerContext = createContext(null, httpRequestBuilder, httpResponseBuilder); httpServerContext.attributes().put("responsebuilder", httpResponseBuilder); - getRouter().routeStatus(httpResponseStatus, httpServerContext); + try { + getRouter().routeStatus(httpResponseStatus, httpServerContext); + } catch (Throwable t) { + logger.log(Level.SEVERE, t.getMessage(), t); + throw t; + } }); logger.log(Level.FINE, "dispatching status " + future); } @@ -166,7 +181,7 @@ public class BaseApplication implements Application { } protected Codec buildSessionCodec(HttpServerContext httpServerContext) { - return new MemoryPropertiesSessionCodec(this, 1024, Duration.ofDays(1)); + return new MemoryPropertiesSessionCodec(sessionName,this, 1024, Duration.ofDays(1)); } protected HttpHandler buildIncomingSessionHandler(HttpServerContext httpServerContext) { @@ -175,7 +190,7 @@ public class BaseApplication implements Application { return new IncomingSessionHandler( getSecret(), "HmacSHA1", - "SESS", + sessionName, sessionCodec, getStaticFileSuffixes(), "user_id", @@ -188,7 +203,7 @@ public class BaseApplication implements Application { return new OutgoingSessionHandler( getSecret(), "HmacSHA1", - "SESS", + sessionName, Duration.ofDays(1), sessionCodec, getStaticFileSuffixes(), @@ -202,13 +217,13 @@ public class BaseApplication implements Application { @Override public void onCreated(Session session) { - logger.log(Level.INFO, "session created = " + session); + logger.log(Level.FINE, "session name = " + sessionName + " created = " + session); builder.applicationModuleList.forEach(module -> module.onOpen(this, session)); } @Override public void onDestroy(Session session) { - logger.log(Level.INFO, "session destroyed = " + session); + logger.log(Level.FINE, "session name = " + sessionName + " destroyed = " + session); builder.applicationModuleList.forEach(module -> module.onClose(this, session)); } diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/BaseApplicationBuilder.java b/net-http-server/src/main/java/org/xbib/net/http/server/BaseApplicationBuilder.java index bd47a9f..7427d22 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/BaseApplicationBuilder.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/BaseApplicationBuilder.java @@ -4,7 +4,6 @@ import org.xbib.config.ConfigLoader; import org.xbib.config.ConfigLogger; import org.xbib.config.ConfigParams; import org.xbib.config.SystemConfigLogger; -import org.xbib.datastructures.common.ImmutableSet; import org.xbib.net.http.server.route.HttpRouter; import org.xbib.settings.Settings; @@ -136,12 +135,8 @@ public class BaseApplicationBuilder implements ApplicationBuilder { return this; } - public ApplicationBuilder addStaticSuffixes(String... suffixes) { - ImmutableSet.Builder builder = ImmutableSet.builder(); - for (String suffix : suffixes) { - builder.add(suffix); - } - this.staticFileSuffixes = builder.build(new String[]{}); + public ApplicationBuilder setStaticSuffixes(String... suffixes) { + this.staticFileSuffixes = Set.of(suffixes); return this; } @@ -152,12 +147,13 @@ public class BaseApplicationBuilder implements ApplicationBuilder { @Override public Application build() { + prepareApplication(); Application application = new BaseApplication(this); setupApplication(application); return application; } - protected void setupApplication(Application application) { + protected void prepareApplication() { String name = System.getProperty("application.name"); if (name == null) { name = "application"; @@ -176,6 +172,15 @@ public class BaseApplicationBuilder implements ApplicationBuilder { this.configLoader = ConfigLoader.getInstance() .withLogger(bootLogger); this.settings = configLoader.load(configParams); + if (staticFileSuffixes == null) { + staticFileSuffixes = DEFAULT_SUFFIXES; + } + } + + protected void setupApplication(Application application) { + if (router != null) { + router.setApplication(application); + } for (Map.Entry entry : settings.getGroups("module").entrySet()) { String moduleName = entry.getKey(); Settings moduleSettings = entry.getValue(); @@ -197,22 +202,8 @@ public class BaseApplicationBuilder implements ApplicationBuilder { logger.log(Level.WARNING, "disabled module: " + moduleName); } } - if (router != null) { - router.setApplication(application); - } - if (staticFileSuffixes == null) { - staticFileSuffixes = DEFAULT_SUFFIXES; - } } - private static final Set DEFAULT_SUFFIXES = ImmutableSet.builder() - .add("css") - .add("js") - .add("ico") - .add("png") - .add("jpg") - .add("jpeg") - .add("gif") - .add("woff2") - .build(new String[]{}); + private static final Set DEFAULT_SUFFIXES = + Set.of("css", "js", "ico", "png", "jpg", "jpeg", "gif", "woff2"); } diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/resource/AbstractResourceHandler.java b/net-http-server/src/main/java/org/xbib/net/http/server/resource/AbstractResourceHandler.java index 0e097cb..e8f5ae1 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/resource/AbstractResourceHandler.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/resource/AbstractResourceHandler.java @@ -59,8 +59,7 @@ public abstract class AbstractResourceHandler implements HttpHandler { Resource resource = createResource(context); logger.log(Level.FINE, "handle: resource = " + (resource != null ? resource.getClass().getName() + " " + resource : null)); if (resource instanceof HtmlTemplateResource) { - logger.log(Level.FINE, "handle: HTML template resource, generate cacheable resource, parameter = " + - context.httpRequest().getParameter()); + logger.log(Level.FINE, "handle: HTML template resource, generate cacheable resource"); generateCacheableResource(context, resource); logger.log(Level.FINE, "handle: done"); return; diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/resource/HtmlTemplateResource.java b/net-http-server/src/main/java/org/xbib/net/http/server/resource/HtmlTemplateResource.java index b3c386d..35b42ab 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/resource/HtmlTemplateResource.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/resource/HtmlTemplateResource.java @@ -49,23 +49,24 @@ public class HtmlTemplateResource implements HttpServerResource { if (root == null) { throw new IllegalArgumentException("no home path set for template resource resolving"); } + logger.log(Level.FINE, "class = " + getClass().getName()); logger.log(Level.FINE, "root = " + root); this.resourcePath = httpServerContext.request().getRequestPath().substring(1); logger.log(Level.FINE, "resource path = " + resourcePath); this.path = resourcePath.length() > 0 ? root.resolve(resourcePath) : root; logger.log(Level.FINE, "path = " + path); logger.log(Level.FINE, "index file name = " + indexFileName); - this.url = URL.create(path.toUri().toString()); - logger.log(Level.FINE, "uri = " + url); this.name = path.getFileName().toString(); this.baseName = AbstractResourceHandler.basename(name); this.suffix = AbstractResourceHandler.suffix(name); if (Files.isDirectory(path)) { if (getIndexFileName() != null) { Path indexPath = path.resolve(indexFileName); + logger.log(Level.FINE, "index path = " + indexPath); if (Files.exists(indexPath)) { this.isExistsIndexFile = true; this.path = indexPath; + logger.log(Level.FINE, "index file path found = " + path); this.isDirectory = false; } else { this.isExistsIndexFile = false; @@ -82,6 +83,8 @@ public class HtmlTemplateResource implements HttpServerResource { this.isExists = Files.exists(path); logger.log(Level.FINE, "exists = " + isExists); logger.log(Level.FINE, "isDirectory = " + isDirectory); + this.url = URL.create(path.toUri().toString()); + logger.log(Level.FINE, "url = " + url); if (isExists) { this.lastModified = Files.getLastModifiedTime(path).toInstant(); } else { diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/session/BaseSession.java b/net-http-server/src/main/java/org/xbib/net/http/server/session/BaseSession.java index 2d2970b..74d6182 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/session/BaseSession.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/session/BaseSession.java @@ -18,6 +18,8 @@ public class BaseSession implements Session { private final SessionListener sessionListener; + private final String name; + private final String id; private final Duration lifetime; @@ -30,11 +32,13 @@ public class BaseSession implements Session { public BaseSession(SessionListener sessionListener, int cacheSize, + String name, String id, boolean create, Duration lifetime) { this.cacheSize = cacheSize; this.sessionListener = sessionListener; + this.name = name; this.id = id; this.lifetime = lifetime; this.map = new LinkedHashMap<>(); @@ -47,6 +51,12 @@ public class BaseSession implements Session { } } } + + @Override + public String name() { + return name; + } + @Override public String id() { return id; diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/session/Session.java b/net-http-server/src/main/java/org/xbib/net/http/server/session/Session.java index 7352a75..2bb6adf 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/session/Session.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/session/Session.java @@ -5,6 +5,8 @@ import java.util.Map; public interface Session extends Map { + String name(); + String id(); void invalidate(); diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/session/file/FileJsonSessionCodec.java b/net-http-server/src/main/java/org/xbib/net/http/server/session/file/FileJsonSessionCodec.java index b03ce7e..6973da7 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/session/file/FileJsonSessionCodec.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/session/file/FileJsonSessionCodec.java @@ -27,6 +27,8 @@ public class FileJsonSessionCodec implements Codec { private static final Logger logger = Logger.getLogger(FileJsonSessionCodec.class.getName()); + private final String name; + private final ReentrantReadWriteLock lock; private final SessionListener sessionListener; @@ -37,10 +39,13 @@ public class FileJsonSessionCodec implements Codec { private final Duration sessionDuration; - public FileJsonSessionCodec(SessionListener sessionListener, + public FileJsonSessionCodec(String name, + SessionListener sessionListener, int sessionCacheSize, Duration sessionDuration, - Path path) { + Path path + ) { + this.name = name; this.sessionListener = sessionListener; this.path = path; this.sessionCacheSize = sessionCacheSize; @@ -56,7 +61,7 @@ public class FileJsonSessionCodec implements Codec { @Override public Session create(String key) throws IOException { - return new BaseSession(sessionListener, sessionCacheSize, key, true, sessionDuration); + return new BaseSession(sessionListener, sessionCacheSize, name, key, true, sessionDuration); } @Override @@ -66,7 +71,7 @@ public class FileJsonSessionCodec implements Codec { try { readLock.lock(); PercentEncoder percentEncoder = PercentEncoders.getUnreservedEncoder(StandardCharsets.UTF_8); - session = new BaseSession(sessionListener, sessionCacheSize, key, false, sessionDuration); + session = new BaseSession(sessionListener, sessionCacheSize, name, key, false, sessionDuration); Map map = JsonUtil.toMap(Files.readString(path.resolve(percentEncoder.encode(key)))); session.putAll(map); return session; diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/session/jdbc/JdbcSessionCodec.java b/net-http-server/src/main/java/org/xbib/net/http/server/session/jdbc/JdbcSessionCodec.java index 560fa77..640eb12 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/session/jdbc/JdbcSessionCodec.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/session/jdbc/JdbcSessionCodec.java @@ -17,7 +17,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.sql.DataSource; -import org.xbib.net.http.server.HttpServerContext; import org.xbib.net.http.server.persist.Codec; import org.xbib.net.http.server.session.BaseSession; import org.xbib.net.http.server.session.Session; @@ -26,6 +25,8 @@ import org.xbib.net.util.JsonUtil; public class JdbcSessionCodec implements Codec, Closeable { + private final String name; + private final SessionListener sessionListener; private final int sessionCacheSize; @@ -44,7 +45,7 @@ public class JdbcSessionCodec implements Codec, Closeable { private final ScheduledExecutorService scheduledExecutorService; - public JdbcSessionCodec(HttpServerContext httpServerContext, + public JdbcSessionCodec(String name, SessionListener sessionListener, int sessionCacheSize, Duration sessionDuration, @@ -53,6 +54,7 @@ public class JdbcSessionCodec implements Codec, Closeable { String writeSessionStringStatement, String deleteSessionStringStatement, String purgeSessionStringStatement) { + this.name = name; this.sessionListener = sessionListener; this.sessionCacheSize = sessionCacheSize; this.sessionDuration = sessionDuration; @@ -67,7 +69,7 @@ public class JdbcSessionCodec implements Codec, Closeable { @Override public Session create(String key) throws IOException { - return new BaseSession(sessionListener, sessionCacheSize, key, true, sessionDuration); + return new BaseSession(sessionListener, sessionCacheSize, name, key, true, sessionDuration); } @Override @@ -76,7 +78,7 @@ public class JdbcSessionCodec implements Codec, Closeable { try { Map map = JsonUtil.toMap(readString(key)); if (map != null) { - session = new BaseSession(sessionListener, sessionCacheSize, key, false, sessionDuration); + session = new BaseSession(sessionListener, sessionCacheSize, name, key, false, sessionDuration); session.putAll(map); return session; } diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/session/memory/MemoryPropertiesSessionCodec.java b/net-http-server/src/main/java/org/xbib/net/http/server/session/memory/MemoryPropertiesSessionCodec.java index a978655..4232372 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/session/memory/MemoryPropertiesSessionCodec.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/session/memory/MemoryPropertiesSessionCodec.java @@ -14,28 +14,32 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; public class MemoryPropertiesSessionCodec implements Codec { - private final ReentrantReadWriteLock lock; - private static final Map store = new HashMap<>(); + private final String name; + + private final ReentrantReadWriteLock lock; + private final SessionListener sessionListener; private final int sessionCacheSize; private final Duration sessionDuration; - public MemoryPropertiesSessionCodec(SessionListener sessionListener, + public MemoryPropertiesSessionCodec(String name, + SessionListener sessionListener, int sessionCacheSize, Duration sessionDuration) { - this.lock = new ReentrantReadWriteLock(); + this.name = name; this.sessionListener = sessionListener; this.sessionCacheSize = sessionCacheSize; this.sessionDuration = sessionDuration; + this.lock = new ReentrantReadWriteLock(); } @Override public Session create(String key) throws IOException { - return new BaseSession(sessionListener, sessionCacheSize, key, true, sessionDuration); + return new BaseSession(sessionListener, sessionCacheSize, name, key, true, sessionDuration); } @Override @@ -66,7 +70,7 @@ public class MemoryPropertiesSessionCodec implements Codec { } private Session toSession(String key, Properties properties) { - Session session = new BaseSession(sessionListener, sessionCacheSize, key, false, sessionDuration); + Session session = new BaseSession(sessionListener, sessionCacheSize, name, key, false, sessionDuration); properties.forEach((k, v) -> session.put(k.toString(), v)); return session; } diff --git a/net-http-server/src/main/java/org/xbib/net/http/server/util/BlockingThreadPoolExecutor.java b/net-http-server/src/main/java/org/xbib/net/http/server/util/BlockingThreadPoolExecutor.java index 72929f6..62d0479 100644 --- a/net-http-server/src/main/java/org/xbib/net/http/server/util/BlockingThreadPoolExecutor.java +++ b/net-http-server/src/main/java/org/xbib/net/http/server/util/BlockingThreadPoolExecutor.java @@ -5,6 +5,7 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.concurrent.FutureTask; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; @@ -26,7 +27,7 @@ public class BlockingThreadPoolExecutor extends ThreadPoolExecutor { ThreadFactory threadFactory) { super(nThreads, nThreads, keepAliveTime, timeUnit, createBlockingQueue(maxQueue), threadFactory); logger.log(Level.INFO, "blocking threadpool executor up with nThreads = " + nThreads + - " keepALiveTime = " + keepAliveTime + + " keepAliveTime = " + keepAliveTime + " time unit = " + timeUnit + " maxQueue = " + maxQueue + " thread factory = " + threadFactory); @@ -42,7 +43,7 @@ public class BlockingThreadPoolExecutor extends ThreadPoolExecutor { @Override protected void afterExecute(Runnable runnable, Throwable terminationCause) { super.afterExecute(runnable, terminationCause); - logger.log(Level.FINE, "after dispatching " + runnable); + logger.log(Level.FINE, "after dispatching " + runnable + " terminationCause = " + terminationCause); Throwable throwable = terminationCause; if (throwable == null && runnable instanceof Future) { try { diff --git a/net-http-template-groovy/src/main/java/org/xbib/net/http/template/groovy/DefaultMarkupTemplate.java b/net-http-template-groovy/src/main/java/org/xbib/net/http/template/groovy/DefaultMarkupTemplate.java index 9338b94..5b31231 100644 --- a/net-http-template-groovy/src/main/java/org/xbib/net/http/template/groovy/DefaultMarkupTemplate.java +++ b/net-http-template-groovy/src/main/java/org/xbib/net/http/template/groovy/DefaultMarkupTemplate.java @@ -3,6 +3,8 @@ package org.xbib.net.http.template.groovy; import groovy.text.markup.BaseTemplate; import groovy.text.markup.MarkupTemplateEngine; import groovy.text.markup.TemplateConfiguration; + +import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; import org.xbib.net.URL; @@ -27,13 +29,13 @@ public abstract class DefaultMarkupTemplate extends BaseTemplate { private static final Logger logger = Logger.getLogger(DefaultMarkupTemplate.class.getName()); - private final Application application; + protected final Application application; - private final HttpRequest request; + protected final Session session; - private final HttpResponseBuilder responseBuilder; + protected final HttpRequest request; - private final Session session; + protected final HttpResponseBuilder responseBuilder; public DefaultMarkupTemplate(MarkupTemplateEngine templateEngine, Map model, @@ -41,9 +43,13 @@ public abstract class DefaultMarkupTemplate extends BaseTemplate { TemplateConfiguration configuration) { super(templateEngine, model, modelTypes, configuration); this.application = (Application) model.get("application"); - this.request = (HttpRequest) model.get("request"); - this.responseBuilder = (HttpResponseBuilder) model.get("responsebuilder"); + Objects.requireNonNull(this.application, "application must not be null"); this.session = (Session) model.get("session"); + Objects.requireNonNull(this.session, "session must not be null"); + this.request = (HttpRequest) model.get("request"); + Objects.requireNonNull(this.request, "request must not be null"); + this.responseBuilder = (HttpResponseBuilder) model.get("responsebuilder"); + Objects.requireNonNull(this.responseBuilder, "response must not be null"); } public void responseStatus(HttpResponseStatus responseStatus) { @@ -67,23 +73,23 @@ public abstract class DefaultMarkupTemplate extends BaseTemplate { responseBuilder.setHeader(HttpHeaderNames.CONTENT_LENGTH, Integer.toString(contentLength)); } - public void sendPermanentRedirect(String url) { - responseBuilder.setResponseStatus(HttpResponseStatus.MOVED_PERMANENTLY); + public void movedPermanently(String url) { + responseBuilder.setResponseStatus(HttpResponseStatus.MOVED_PERMANENTLY); // 301 responseBuilder.setHeader(HttpHeaderNames.LOCATION, url); } - public void sendRedirect(String url) { - responseBuilder.setResponseStatus(HttpResponseStatus.FOUND); + public void found(String url) { + responseBuilder.setResponseStatus(HttpResponseStatus.FOUND); // 302 responseBuilder.setHeader(HttpHeaderNames.LOCATION, url); } public void seeOther(String url) { - responseBuilder.setResponseStatus(HttpResponseStatus.SEE_OTHER); + responseBuilder.setResponseStatus(HttpResponseStatus.SEE_OTHER); // 303 responseBuilder.setHeader(HttpHeaderNames.LOCATION, url); } public void temporaryRedirect(String url) { - responseBuilder.setResponseStatus(HttpResponseStatus.TEMPORARY_REDIRECT); + responseBuilder.setResponseStatus(HttpResponseStatus.TEMPORARY_REDIRECT); // 307 responseBuilder.setHeader(HttpHeaderNames.LOCATION, url); }