From d3635df407405966c059f63e3512b16eb0bfb779 Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Fri, 19 Nov 2021 23:58:43 +0200 Subject: [PATCH 01/12] Add initial support for inject --- pippo-core/pom.xml | 8 ++++++++ pippo-core/src/main/java/ro/pippo/core/Languages.java | 2 ++ pippo-core/src/main/java/ro/pippo/core/Messages.java | 2 ++ pippo-core/src/main/java/ro/pippo/core/Pippo.java | 3 +++ pippo-core/src/main/java/ro/pippo/core/PippoSettings.java | 4 ++++ .../main/java/ro/pippo/core/util/HttpCacheToolkit.java | 2 ++ .../src/main/java/ro/pippo/core/util/MimeTypes.java | 2 ++ 7 files changed, 23 insertions(+) diff --git a/pippo-core/pom.xml b/pippo-core/pom.xml index 649bb81ea..70a7a3d2a 100644 --- a/pippo-core/pom.xml +++ b/pippo-core/pom.xml @@ -29,6 +29,14 @@ ${slf4j.version} + + + javax.inject + javax.inject + 1 + provided + + junit diff --git a/pippo-core/src/main/java/ro/pippo/core/Languages.java b/pippo-core/src/main/java/ro/pippo/core/Languages.java index cd2060524..85f238ed6 100644 --- a/pippo-core/src/main/java/ro/pippo/core/Languages.java +++ b/pippo-core/src/main/java/ro/pippo/core/Languages.java @@ -20,6 +20,7 @@ import ro.pippo.core.route.RouteContext; import ro.pippo.core.util.StringUtils; +import javax.inject.Inject; import javax.servlet.http.Cookie; import java.util.List; import java.util.Locale; @@ -48,6 +49,7 @@ public class Languages { private final Map languageLookup; + @Inject public Languages(PippoSettings pippoSettings) { this.pippoSettings = pippoSettings; diff --git a/pippo-core/src/main/java/ro/pippo/core/Messages.java b/pippo-core/src/main/java/ro/pippo/core/Messages.java index 3b7cf8282..d41405f76 100644 --- a/pippo-core/src/main/java/ro/pippo/core/Messages.java +++ b/pippo-core/src/main/java/ro/pippo/core/Messages.java @@ -21,6 +21,7 @@ import ro.pippo.core.util.ClasspathUtils; import ro.pippo.core.util.StringUtils; +import javax.inject.Inject; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; @@ -51,6 +52,7 @@ public class Messages { private final Languages languages; + @Inject public Messages(Languages languages) { this.languages = languages; this.languageMessages = loadRegisteredMessageResources(); diff --git a/pippo-core/src/main/java/ro/pippo/core/Pippo.java b/pippo-core/src/main/java/ro/pippo/core/Pippo.java index c991c52a1..1ac0dd531 100644 --- a/pippo-core/src/main/java/ro/pippo/core/Pippo.java +++ b/pippo-core/src/main/java/ro/pippo/core/Pippo.java @@ -24,6 +24,7 @@ import ro.pippo.core.route.RouteGroup; import ro.pippo.core.util.ServiceLocator; +import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -50,6 +51,7 @@ public Pippo() { addShutdownHook(); } + @Inject public Pippo(Application application) { this.application = application; log.debug("Application '{}'", application); @@ -130,6 +132,7 @@ public WebServer getServer() { * @param server * @return */ + @Inject public Pippo setServer(WebServer server) { this.server = server; this.server.init(getApplication()); diff --git a/pippo-core/src/main/java/ro/pippo/core/PippoSettings.java b/pippo-core/src/main/java/ro/pippo/core/PippoSettings.java index acea7b11b..a272bb0ff 100644 --- a/pippo-core/src/main/java/ro/pippo/core/PippoSettings.java +++ b/pippo-core/src/main/java/ro/pippo/core/PippoSettings.java @@ -105,6 +105,10 @@ public class PippoSettings { private volatile long lastModified; + public PippoSettings() { + this(RuntimeMode.getCurrent()); + } + public PippoSettings(RuntimeMode runtimeMode) { this.runtimeMode = runtimeMode; this.propertiesUrl = getPropertiesUrl(); diff --git a/pippo-core/src/main/java/ro/pippo/core/util/HttpCacheToolkit.java b/pippo-core/src/main/java/ro/pippo/core/util/HttpCacheToolkit.java index 464ee0f47..6aabe1728 100644 --- a/pippo-core/src/main/java/ro/pippo/core/util/HttpCacheToolkit.java +++ b/pippo-core/src/main/java/ro/pippo/core/util/HttpCacheToolkit.java @@ -22,6 +22,7 @@ import ro.pippo.core.PippoSettings; import ro.pippo.core.route.RouteContext; +import javax.inject.Inject; import java.text.ParseException; import java.util.Date; @@ -34,6 +35,7 @@ public class HttpCacheToolkit { private final PippoSettings pippoSettings; + @Inject public HttpCacheToolkit(PippoSettings pippoSettings) { this.pippoSettings = pippoSettings; } diff --git a/pippo-core/src/main/java/ro/pippo/core/util/MimeTypes.java b/pippo-core/src/main/java/ro/pippo/core/util/MimeTypes.java index 746a6a498..b2ae05745 100644 --- a/pippo-core/src/main/java/ro/pippo/core/util/MimeTypes.java +++ b/pippo-core/src/main/java/ro/pippo/core/util/MimeTypes.java @@ -20,6 +20,7 @@ import ro.pippo.core.PippoConstants; import ro.pippo.core.PippoSettings; +import javax.inject.Inject; import java.io.InputStream; import java.net.URL; import java.util.List; @@ -39,6 +40,7 @@ public class MimeTypes { private final PippoSettings pippoSettings; + @Inject public MimeTypes(PippoSettings pippoSettings) { this.pippoSettings = pippoSettings; this.extPattern = Pattern.compile("^.*\\.([^.]+)$"); From 6797d52c4f5917616dfe972a62be7d048d62c87f Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Fri, 19 Nov 2021 23:59:07 +0200 Subject: [PATCH 02/12] Add support for inject with fallback (lazy getter) in Application --- .../main/java/ro/pippo/core/Application.java | 101 ++++++++++++++---- 1 file changed, 79 insertions(+), 22 deletions(-) diff --git a/pippo-core/src/main/java/ro/pippo/core/Application.java b/pippo-core/src/main/java/ro/pippo/core/Application.java index de5e8d6ff..123c5cd9c 100644 --- a/pippo-core/src/main/java/ro/pippo/core/Application.java +++ b/pippo-core/src/main/java/ro/pippo/core/Application.java @@ -35,8 +35,8 @@ import ro.pippo.core.websocket.WebSocketHandler; import ro.pippo.core.websocket.WebSocketRouter; +import javax.inject.Inject; import javax.servlet.ServletContext; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -52,51 +52,68 @@ public class Application implements ResourceRouting { private static final Logger log = LoggerFactory.getLogger(Application.class); + @Inject private PippoSettings pippoSettings; + + @Inject private Languages languages; + + @Inject private Messages messages; + + @Inject private MimeTypes mimeTypes; + + @Inject private HttpCacheToolkit httpCacheToolkit; + + @Inject private TemplateEngine templateEngine; + + @Inject private ContentTypeEngines engines; + + @Inject protected Router router; + + @Inject private ErrorHandler errorHandler; + + @Inject private RequestResponseFactory requestResponseFactory; + + @Inject private ServletContext servletContext; + @Inject private List initializers; + @Inject private RoutePreDispatchListenerList routePreDispatchListeners; + + @Inject private RoutePostDispatchListenerList routePostDispatchListeners; private Map locals; + + @Inject private RouteHandler notFoundRouteHandler; + @Inject private WebSocketRouter webSocketRouter; public Application() { this(new PippoSettings(RuntimeMode.getCurrent())); } + @Inject public Application(PippoSettings settings) { - this.pippoSettings = settings; - this.languages = new Languages(settings); - this.messages = new Messages(languages); - this.mimeTypes = new MimeTypes(settings); - this.httpCacheToolkit = new HttpCacheToolkit(settings); - this.engines = new ContentTypeEngines(); - this.initializers = new ArrayList<>(); - this.webSocketRouter = new WebSocketRouter(); - - registerContentTypeEngine(TextPlainEngine.class); + pippoSettings = settings; } public final void init() { - // add initializers - initializers.addAll(ServiceLocator.locateAll(Initializer.class)); - // call each initializer - for (Initializer initializer : initializers) { + for (Initializer initializer : getInitializers()) { log.debug("Initializing '{}'", initializer.getClass().getName()); try { initializer.init(this); @@ -119,7 +136,7 @@ public final void init() { public final void destroy() { onDestroy(); - for (Initializer initializer : initializers) { + for (Initializer initializer : getInitializers()) { log.debug("Destroying '{}'", initializer.getClass().getName()); try { initializer.destroy(this); @@ -139,34 +156,54 @@ protected void onDestroy() { * The runtime mode. Must currently be either DEV, TEST, or PROD. */ public RuntimeMode getRuntimeMode() { - return pippoSettings.getRuntimeMode(); + return getPippoSettings().getRuntimeMode(); } public PippoSettings getPippoSettings() { + if (pippoSettings == null) { + pippoSettings = new PippoSettings(RuntimeMode.getCurrent()); + } + return pippoSettings; } public String getApplicationName() { - return pippoSettings.getString(PippoConstants.SETTING_APPLICATION_NAME, ""); + return getPippoSettings().getString(PippoConstants.SETTING_APPLICATION_NAME, ""); } public String getApplicationVersion() { - return pippoSettings.getString(PippoConstants.SETTING_APPLICATION_VERSION, ""); + return getPippoSettings().getString(PippoConstants.SETTING_APPLICATION_VERSION, ""); } public Languages getLanguages() { + if (languages == null) { + languages = new Languages(getPippoSettings()); + } + return languages; } public Messages getMessages() { + if (messages == null) { + messages = new Messages(getLanguages()); + } + return messages; } public MimeTypes getMimeTypes() { + if (mimeTypes == null) { + mimeTypes = new MimeTypes(getPippoSettings()); + } + return mimeTypes; } public HttpCacheToolkit getHttpCacheToolkit() { + if (httpCacheToolkit == null) { + httpCacheToolkit = new HttpCacheToolkit(getPippoSettings()); + } + return httpCacheToolkit; } @@ -193,6 +230,7 @@ public TemplateEngine getTemplateEngine() { return templateEngine; } + @Inject public void setTemplateEngine(TemplateEngine templateEngine) { templateEngine.init(this); this.templateEngine = templateEngine; @@ -200,22 +238,27 @@ public void setTemplateEngine(TemplateEngine templateEngine) { } public ContentTypeEngines getContentTypeEngines() { + if (engines == null) { + engines = new ContentTypeEngines(); + registerContentTypeEngine(TextPlainEngine.class); + } + return engines; } public boolean hasContentTypeEngine(String contentType) { - return engines.hasContentTypeEngine(contentType); + return getContentTypeEngines().hasContentTypeEngine(contentType); } public void registerContentTypeEngine(Class engineClass) { - ContentTypeEngine engine = engines.registerContentTypeEngine(engineClass); + ContentTypeEngine engine = getContentTypeEngines().registerContentTypeEngine(engineClass); if (engine != null) { engine.init(this); } } public ContentTypeEngine getContentTypeEngine(String contentType) { - return engines.getContentTypeEngine(contentType); + return getContentTypeEngines().getContentTypeEngine(contentType); } public Router getRouter() { @@ -226,6 +269,7 @@ public Router getRouter() { return router; } + @Inject public void setRouter(Router router) { setRouter(router, true); } @@ -258,6 +302,7 @@ public ErrorHandler getErrorHandler() { return errorHandler; } + @Inject public void setErrorHandler(ErrorHandler errorHandler) { this.errorHandler = errorHandler; } @@ -352,9 +397,21 @@ public void addWebSocket(String uriPattern, WebSocketHandler webSocketHandler) { } public WebSocketRouter getWebSocketRouter() { + if (webSocketRouter == null) { + webSocketRouter = new WebSocketRouter(); + } + return webSocketRouter; } + public List getInitializers() { + if (initializers == null) { + initializers = ServiceLocator.locateAll(Initializer.class); + } + + return initializers; + } + /** * Returns not null only in the context of the web layer (on a HTTP request). * It cannot be useful in a service (server side business layer). From ab6ce2d2a7108d9e452e1338b373414b2e3b9df9 Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Sat, 20 Nov 2021 00:09:55 +0200 Subject: [PATCH 03/12] Switch from field inject to method inject when a setter is available --- pippo-core/src/main/java/ro/pippo/core/Application.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pippo-core/src/main/java/ro/pippo/core/Application.java b/pippo-core/src/main/java/ro/pippo/core/Application.java index 123c5cd9c..022b421ab 100644 --- a/pippo-core/src/main/java/ro/pippo/core/Application.java +++ b/pippo-core/src/main/java/ro/pippo/core/Application.java @@ -67,13 +67,11 @@ public class Application implements ResourceRouting { @Inject private HttpCacheToolkit httpCacheToolkit; - @Inject private TemplateEngine templateEngine; @Inject private ContentTypeEngines engines; - @Inject protected Router router; @Inject @@ -96,7 +94,6 @@ public class Application implements ResourceRouting { private Map locals; - @Inject private RouteHandler notFoundRouteHandler; @Inject @@ -379,6 +376,7 @@ public void addRouteTransformer(RouteTransformer transformer) { * * @param routeHandler */ + @Inject public void setNotFoundRouteHandler(RouteHandler routeHandler) { this.notFoundRouteHandler = routeHandler; } @@ -393,7 +391,7 @@ public RouteHandler getNotFoundRouteHandler() { } public void addWebSocket(String uriPattern, WebSocketHandler webSocketHandler) { - webSocketRouter.addRoute(uriPattern, webSocketHandler); + getWebSocketRouter().addRoute(uriPattern, webSocketHandler); } public WebSocketRouter getWebSocketRouter() { From d89ee95d92f617cf6283988d3e13089d4a527484 Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Sat, 20 Nov 2021 00:23:43 +0200 Subject: [PATCH 04/12] Add support for inject in ControllerApplication --- pippo-controller-parent/pippo-controller/pom.xml | 8 ++++++++ .../ro/pippo/controller/ControllerApplication.java | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/pippo-controller-parent/pippo-controller/pom.xml b/pippo-controller-parent/pippo-controller/pom.xml index 4af2e0135..ccd4d8501 100644 --- a/pippo-controller-parent/pippo-controller/pom.xml +++ b/pippo-controller-parent/pippo-controller/pom.xml @@ -39,6 +39,14 @@ provided + + + javax.inject + javax.inject + 1 + provided + + junit diff --git a/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java b/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java index b7942b2aa..791cd58c1 100644 --- a/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java +++ b/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java @@ -22,6 +22,7 @@ import ro.pippo.core.PippoSettings; import ro.pippo.core.util.ServiceLocator; +import javax.inject.Inject; import java.util.Arrays; import java.util.List; @@ -32,17 +33,25 @@ public class ControllerApplication extends Application { private static final Logger log = LoggerFactory.getLogger(ControllerApplication.class); + @Inject private ControllerInstantiationListenerList controllerInstantiationListeners; + + @Inject private ControllerInitializationListenerList controllerInitializationListeners; + + @Inject private ControllerInvokeListenerList controllerInvokeListeners; private ControllerFactory controllerFactory; + + @Inject private List extractors; public ControllerApplication() { super(); } + @Inject public ControllerApplication(PippoSettings settings) { super(settings); } @@ -79,6 +88,7 @@ public ControllerFactory getControllerFactory() { return controllerFactory; } + @Inject public ControllerApplication setControllerFactory(ControllerFactory controllerFactory) { this.controllerFactory = controllerFactory; log.debug("Controller factory is '{}'", controllerFactory.getClass().getName()); From 01a74ab44685bfb1f8b4ad24258b0ba3b9fef2e1 Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Sat, 20 Nov 2021 04:14:37 +0200 Subject: [PATCH 05/12] True optional inject --- .../controller/ControllerApplication.java | 45 +++--- .../main/java/ro/pippo/core/Application.java | 132 +++++++++--------- 2 files changed, 87 insertions(+), 90 deletions(-) diff --git a/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java b/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java index 791cd58c1..a7baf6a7d 100644 --- a/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java +++ b/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java @@ -25,6 +25,7 @@ import javax.inject.Inject; import java.util.Arrays; import java.util.List; +import java.util.Optional; /** * @author Decebal Suiu @@ -34,18 +35,19 @@ public class ControllerApplication extends Application { private static final Logger log = LoggerFactory.getLogger(ControllerApplication.class); @Inject - private ControllerInstantiationListenerList controllerInstantiationListeners; + private Optional controllerInstantiationListeners; @Inject - private ControllerInitializationListenerList controllerInitializationListeners; + private Optional controllerInitializationListeners; @Inject - private ControllerInvokeListenerList controllerInvokeListeners; + private Optional controllerInvokeListeners; - private ControllerFactory controllerFactory; + @Inject + private Optional controllerFactory; @Inject - private List extractors; + private Optional> extractors; public ControllerApplication() { super(); @@ -57,40 +59,39 @@ public ControllerApplication(PippoSettings settings) { } public ControllerInstantiationListenerList getControllerInstantiationListeners() { - if (controllerInstantiationListeners == null) { - controllerInstantiationListeners = new ControllerInstantiationListenerList(); + if (!controllerInstantiationListeners.isPresent()) { + controllerInstantiationListeners = Optional.of(new ControllerInstantiationListenerList()); } - return controllerInstantiationListeners; + return controllerInstantiationListeners.get(); } public ControllerInitializationListenerList getControllerInitializationListeners() { - if (controllerInitializationListeners == null) { - controllerInitializationListeners = new ControllerInitializationListenerList(); + if (!controllerInitializationListeners.isPresent()) { + controllerInitializationListeners = Optional.of(new ControllerInitializationListenerList()); } - return controllerInitializationListeners; + return controllerInitializationListeners.get(); } public ControllerInvokeListenerList getControllerInvokeListeners() { - if (controllerInvokeListeners == null) { - controllerInvokeListeners = new ControllerInvokeListenerList(); + if (!controllerInvokeListeners.isPresent()) { + controllerInvokeListeners = Optional.of(new ControllerInvokeListenerList()); } - return controllerInvokeListeners; + return controllerInvokeListeners.get(); } public ControllerFactory getControllerFactory() { - if (controllerFactory == null) { - controllerFactory = new DefaultControllerFactory(); + if (!controllerFactory.isPresent()) { + controllerFactory = Optional.of(new DefaultControllerFactory()); } - return controllerFactory; + return controllerFactory.get(); } - @Inject public ControllerApplication setControllerFactory(ControllerFactory controllerFactory) { - this.controllerFactory = controllerFactory; + this.controllerFactory = Optional.of(controllerFactory); log.debug("Controller factory is '{}'", controllerFactory.getClass().getName()); return this; @@ -103,11 +104,11 @@ public ControllerApplication addExtractors(MethodParameterExtractor... extractor } public List getExtractors() { - if (extractors == null) { - extractors = ServiceLocator.locateAll(MethodParameterExtractor.class); + if (!extractors.isPresent()) { + extractors = Optional.of(ServiceLocator.locateAll(MethodParameterExtractor.class)); } - return extractors; + return extractors.get(); } public ControllerApplication addControllers(String... packageNames) { diff --git a/pippo-core/src/main/java/ro/pippo/core/Application.java b/pippo-core/src/main/java/ro/pippo/core/Application.java index 022b421ab..659120e29 100644 --- a/pippo-core/src/main/java/ro/pippo/core/Application.java +++ b/pippo-core/src/main/java/ro/pippo/core/Application.java @@ -40,6 +40,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; /** * Base class for all Pippo applications. @@ -53,52 +54,51 @@ public class Application implements ResourceRouting { private static final Logger log = LoggerFactory.getLogger(Application.class); @Inject - private PippoSettings pippoSettings; + private Optional languages; @Inject - private Languages languages; + private Optional messages; @Inject - private Messages messages; + private Optional mimeTypes; @Inject - private MimeTypes mimeTypes; + private Optional httpCacheToolkit; @Inject - private HttpCacheToolkit httpCacheToolkit; + private Optional engines; - private TemplateEngine templateEngine; + @Inject + private Optional requestResponseFactory; @Inject - private ContentTypeEngines engines; + private Optional> initializers; - protected Router router; + @Inject + private Optional routePreDispatchListeners; @Inject - private ErrorHandler errorHandler; + private Optional routePostDispatchListeners; @Inject - private RequestResponseFactory requestResponseFactory; + private Optional webSocketRouter; @Inject - private ServletContext servletContext; + private Optional templateEngine; @Inject - private List initializers; + private Optional notFoundRouteHandler; @Inject - private RoutePreDispatchListenerList routePreDispatchListeners; + private Optional router; @Inject - private RoutePostDispatchListenerList routePostDispatchListeners; + private Optional errorHandler; + private PippoSettings pippoSettings; + private ServletContext servletContext; private Map locals; - private RouteHandler notFoundRouteHandler; - - @Inject - private WebSocketRouter webSocketRouter; - public Application() { this(new PippoSettings(RuntimeMode.getCurrent())); } @@ -173,35 +173,35 @@ public String getApplicationVersion() { } public Languages getLanguages() { - if (languages == null) { - languages = new Languages(getPippoSettings()); + if (!languages.isPresent()) { + languages = Optional.of(new Languages(getPippoSettings())); } - return languages; + return languages.get(); } public Messages getMessages() { - if (messages == null) { - messages = new Messages(getLanguages()); + if (!messages.isPresent()) { + messages = Optional.of(new Messages(getLanguages())); } - return messages; + return messages.get(); } public MimeTypes getMimeTypes() { - if (mimeTypes == null) { - mimeTypes = new MimeTypes(getPippoSettings()); + if (!mimeTypes.isPresent()) { + mimeTypes = Optional.of(new MimeTypes(getPippoSettings())); } - return mimeTypes; + return mimeTypes.get(); } public HttpCacheToolkit getHttpCacheToolkit() { - if (httpCacheToolkit == null) { - httpCacheToolkit = new HttpCacheToolkit(getPippoSettings()); + if (!httpCacheToolkit.isPresent()) { + httpCacheToolkit = Optional.of(new HttpCacheToolkit(getPippoSettings())); } - return httpCacheToolkit; + return httpCacheToolkit.get(); } /** @@ -210,7 +210,7 @@ public HttpCacheToolkit getHttpCacheToolkit() { * @param engineClass */ public void registerTemplateEngine(Class engineClass) { - if (templateEngine != null) { + if (templateEngine.isPresent()) { log.debug("Template engine already registered, ignoring '{}'", engineClass.getName()); return; } @@ -224,23 +224,22 @@ public void registerTemplateEngine(Class engineClass) } public TemplateEngine getTemplateEngine() { - return templateEngine; + return templateEngine.orElse(null); } - @Inject public void setTemplateEngine(TemplateEngine templateEngine) { templateEngine.init(this); - this.templateEngine = templateEngine; + this.templateEngine = Optional.of(templateEngine); log.debug("Template engine is '{}'", templateEngine.getClass().getName()); } public ContentTypeEngines getContentTypeEngines() { - if (engines == null) { - engines = new ContentTypeEngines(); + if (!engines.isPresent()) { + engines = Optional.of(new ContentTypeEngines()); registerContentTypeEngine(TextPlainEngine.class); } - return engines; + return engines.get(); } public boolean hasContentTypeEngine(String contentType) { @@ -259,14 +258,13 @@ public ContentTypeEngine getContentTypeEngine(String contentType) { } public Router getRouter() { - if (router == null) { - router = new DefaultRouter(); + if (!router.isPresent()) { + router = Optional.of(new DefaultRouter()); } - return router; + return router.get(); } - @Inject public void setRouter(Router router) { setRouter(router, true); } @@ -274,11 +272,11 @@ public void setRouter(Router router) { public void setRouter(Router router, boolean preserveOldTransformers) { if (preserveOldTransformers && (router != null)) { // preserve route transformers already registered - List transformers = this.router.getRouteTransformers(); + List transformers = this.router.get().getRouteTransformers(); transformers.forEach(router::addRouteTransformer); } - this.router = router; + this.router = Optional.of(router); } @Override @@ -292,24 +290,23 @@ public void addRouteGroup(RouteGroup routeGroup) { } public ErrorHandler getErrorHandler() { - if (errorHandler == null) { - errorHandler = new DefaultErrorHandler(this); + if (!errorHandler.isPresent()) { + errorHandler = Optional.of(new DefaultErrorHandler(this)); } - return errorHandler; + return errorHandler.get(); } - @Inject public void setErrorHandler(ErrorHandler errorHandler) { - this.errorHandler = errorHandler; + this.errorHandler = Optional.of(errorHandler); } public final RequestResponseFactory getRequestResponseFactory() { - if (requestResponseFactory == null) { - requestResponseFactory = createRequestResponseFactory(); + if (!requestResponseFactory.isPresent()) { + requestResponseFactory = Optional.of(createRequestResponseFactory()); } - return requestResponseFactory; + return requestResponseFactory.get(); } /** @@ -323,19 +320,19 @@ protected RequestResponseFactory createRequestResponseFactory() { } public RoutePreDispatchListenerList getRoutePreDispatchListeners() { - if (routePreDispatchListeners == null) { - routePreDispatchListeners = new RoutePreDispatchListenerList(); + if (!routePreDispatchListeners.isPresent()) { + routePreDispatchListeners = Optional.of(new RoutePreDispatchListenerList()); } - return routePreDispatchListeners; + return routePreDispatchListeners.get(); } public RoutePostDispatchListenerList getRoutePostDispatchListeners() { - if (routePostDispatchListeners == null) { - routePostDispatchListeners = new RoutePostDispatchListenerList(); + if (!routePostDispatchListeners.isPresent()) { + routePostDispatchListeners = Optional.of(new RoutePostDispatchListenerList()); } - return routePostDispatchListeners; + return routePostDispatchListeners.get(); } public Map getLocals() { @@ -376,9 +373,8 @@ public void addRouteTransformer(RouteTransformer transformer) { * * @param routeHandler */ - @Inject public void setNotFoundRouteHandler(RouteHandler routeHandler) { - this.notFoundRouteHandler = routeHandler; + this.notFoundRouteHandler = Optional.of(routeHandler); } /** @@ -387,7 +383,7 @@ public void setNotFoundRouteHandler(RouteHandler routeHandler) { * @return */ public RouteHandler getNotFoundRouteHandler() { - return notFoundRouteHandler; + return notFoundRouteHandler.orElse(null); } public void addWebSocket(String uriPattern, WebSocketHandler webSocketHandler) { @@ -395,25 +391,25 @@ public void addWebSocket(String uriPattern, WebSocketHandler webSocketHandler) { } public WebSocketRouter getWebSocketRouter() { - if (webSocketRouter == null) { - webSocketRouter = new WebSocketRouter(); + if (!webSocketRouter.isPresent()) { + webSocketRouter = Optional.of(new WebSocketRouter()); } - return webSocketRouter; + return webSocketRouter.get(); } public List getInitializers() { - if (initializers == null) { - initializers = ServiceLocator.locateAll(Initializer.class); + if (!initializers.isPresent()) { + initializers = Optional.of(ServiceLocator.locateAll(Initializer.class)); } - return initializers; + return initializers.get(); } /** * Returns not null only in the context of the web layer (on a HTTP request). * It cannot be useful in a service (server side business layer). - * For example if want to have access to PippoSettings from a service you must to inject PippoSettings + * For example if you want to have access to PippoSettings from a service you must inject PippoSettings * in that service and not to use Application.get().getPippoSettings(). * * @return The application instance or null From b9065ebd9e141fc549cd171e6b3a007744cfc597 Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Sat, 20 Nov 2021 04:15:53 +0200 Subject: [PATCH 06/12] Fix warning --- pippo-core/src/main/java/ro/pippo/core/Application.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pippo-core/src/main/java/ro/pippo/core/Application.java b/pippo-core/src/main/java/ro/pippo/core/Application.java index 659120e29..da1191002 100644 --- a/pippo-core/src/main/java/ro/pippo/core/Application.java +++ b/pippo-core/src/main/java/ro/pippo/core/Application.java @@ -87,7 +87,7 @@ public class Application implements ResourceRouting { private Optional templateEngine; @Inject - private Optional notFoundRouteHandler; + private Optional> notFoundRouteHandler; @Inject private Optional router; @@ -382,7 +382,7 @@ public void setNotFoundRouteHandler(RouteHandler routeHandler) { * * @return */ - public RouteHandler getNotFoundRouteHandler() { + public RouteHandler getNotFoundRouteHandler() { return notFoundRouteHandler.orElse(null); } From ae7d8dcdfce9f45af24284a927ef46ed89bfa27c Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Sat, 20 Nov 2021 14:05:40 +0200 Subject: [PATCH 07/12] Fix NPE when inject is not used --- .../controller/ControllerApplication.java | 10 +++---- .../main/java/ro/pippo/core/Application.java | 28 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java b/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java index a7baf6a7d..972d9aba7 100644 --- a/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java +++ b/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java @@ -35,19 +35,19 @@ public class ControllerApplication extends Application { private static final Logger log = LoggerFactory.getLogger(ControllerApplication.class); @Inject - private Optional controllerInstantiationListeners; + private Optional controllerInstantiationListeners = Optional.empty(); @Inject - private Optional controllerInitializationListeners; + private Optional controllerInitializationListeners = Optional.empty(); @Inject - private Optional controllerInvokeListeners; + private Optional controllerInvokeListeners = Optional.empty(); @Inject - private Optional controllerFactory; + private Optional controllerFactory = Optional.empty(); @Inject - private Optional> extractors; + private Optional> extractors = Optional.empty(); public ControllerApplication() { super(); diff --git a/pippo-core/src/main/java/ro/pippo/core/Application.java b/pippo-core/src/main/java/ro/pippo/core/Application.java index da1191002..fc07f0785 100644 --- a/pippo-core/src/main/java/ro/pippo/core/Application.java +++ b/pippo-core/src/main/java/ro/pippo/core/Application.java @@ -54,46 +54,46 @@ public class Application implements ResourceRouting { private static final Logger log = LoggerFactory.getLogger(Application.class); @Inject - private Optional languages; + private Optional languages = Optional.empty(); @Inject - private Optional messages; + private Optional messages = Optional.empty(); @Inject - private Optional mimeTypes; + private Optional mimeTypes = Optional.empty(); @Inject - private Optional httpCacheToolkit; + private Optional httpCacheToolkit = Optional.empty(); @Inject - private Optional engines; + private Optional engines = Optional.empty(); @Inject - private Optional requestResponseFactory; + private Optional requestResponseFactory = Optional.empty(); @Inject - private Optional> initializers; + private Optional> initializers = Optional.empty(); @Inject - private Optional routePreDispatchListeners; + private Optional routePreDispatchListeners = Optional.empty(); @Inject - private Optional routePostDispatchListeners; + private Optional routePostDispatchListeners = Optional.empty(); @Inject - private Optional webSocketRouter; + private Optional webSocketRouter = Optional.empty(); @Inject - private Optional templateEngine; + private Optional templateEngine = Optional.empty(); @Inject - private Optional> notFoundRouteHandler; + private Optional> notFoundRouteHandler = Optional.empty(); @Inject - private Optional router; + private Optional router = Optional.empty(); @Inject - private Optional errorHandler; + private Optional errorHandler = Optional.empty(); private PippoSettings pippoSettings; private ServletContext servletContext; From 1a5cdd0fc96878492818d3e000ff25bf8f199186 Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Sat, 20 Nov 2021 15:20:56 +0200 Subject: [PATCH 08/12] Fix warnings, add protection --- pippo-core/src/main/java/ro/pippo/core/Application.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pippo-core/src/main/java/ro/pippo/core/Application.java b/pippo-core/src/main/java/ro/pippo/core/Application.java index fc07f0785..066130029 100644 --- a/pippo-core/src/main/java/ro/pippo/core/Application.java +++ b/pippo-core/src/main/java/ro/pippo/core/Application.java @@ -40,6 +40,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -270,9 +271,10 @@ public void setRouter(Router router) { } public void setRouter(Router router, boolean preserveOldTransformers) { - if (preserveOldTransformers && (router != null)) { + Objects.requireNonNull(router); + if (preserveOldTransformers) { // preserve route transformers already registered - List transformers = this.router.get().getRouteTransformers(); + List transformers = getRouter().getRouteTransformers(); transformers.forEach(router::addRouteTransformer); } @@ -373,7 +375,7 @@ public void addRouteTransformer(RouteTransformer transformer) { * * @param routeHandler */ - public void setNotFoundRouteHandler(RouteHandler routeHandler) { + public void setNotFoundRouteHandler(RouteHandler routeHandler) { this.notFoundRouteHandler = Optional.of(routeHandler); } From 6ad7ebe72f3d94eab1a6192a6b09569e6d884689 Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Tue, 30 Nov 2021 01:37:30 +0200 Subject: [PATCH 09/12] Fix conflict merge --- .../controller/ControllerApplication.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java b/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java index af7011248..db817bc9e 100644 --- a/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java +++ b/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java @@ -19,11 +19,8 @@ import org.slf4j.LoggerFactory; import ro.pippo.core.Application; import ro.pippo.core.PippoSettings; -import ro.pippo.core.util.ServiceLocator; import javax.inject.Inject; -import java.util.Arrays; -import java.util.List; import java.util.Optional; /** @@ -42,7 +39,8 @@ public class ControllerApplication extends Application { @Inject private Optional controllerInvokeListeners = Optional.empty(); - private ControllerRouteFactory controllerRouteFactory; + @Inject + private Optional controllerRouteFactory = Optional.empty(); public ControllerApplication() { super(); @@ -70,26 +68,26 @@ public ControllerInitializationListenerList getControllerInitializationListeners } public ControllerInvokeListenerList getControllerInvokeListeners() { - if (controllerInvokeListeners == null) { - controllerInvokeListeners = new ControllerInvokeListenerList(); + if (!controllerInvokeListeners.isPresent()) { + controllerInvokeListeners = Optional.of(new ControllerInvokeListenerList()); } - return controllerInvokeListeners; + return controllerInvokeListeners.get(); } public ControllerRouteFactory getControllerRouteFactory() { - if (controllerRouteFactory == null) { + if (!controllerRouteFactory.isPresent()) { ControllerHandlerFactory controllerHandlerFactory = new DefaultControllerHandlerFactory() .setContentTypeEngines(getContentTypeEngines()); - controllerRouteFactory = new DefaultControllerRouteFactory() - .setControllerHandlerFactory(controllerHandlerFactory); + controllerRouteFactory = Optional.of(new DefaultControllerRouteFactory() + .setControllerHandlerFactory(controllerHandlerFactory)); } - return controllerRouteFactory; + return controllerRouteFactory.get(); } public ControllerApplication setControllerRouteFactory(ControllerRouteFactory controllerRouteFactory) { - this.controllerRouteFactory = controllerRouteFactory; + this.controllerRouteFactory = Optional.of(controllerRouteFactory); log.debug("Controller route factory is '{}'", controllerRouteFactory.getClass().getName()); return this; From d5bd79f9e46ff464fa16dfdb9d9e81e65b324f21 Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Wed, 1 Dec 2021 19:57:24 +0200 Subject: [PATCH 10/12] Fix merge conflict --- .../controller/ControllerApplication.java | 30 ++----------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java b/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java index da32b4209..6cb5dbc81 100644 --- a/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java +++ b/pippo-controller-parent/pippo-controller/src/main/java/ro/pippo/controller/ControllerApplication.java @@ -42,38 +42,12 @@ public ControllerApplication(PippoSettings settings) { super(settings); } - public ControllerInstantiationListenerList getControllerInstantiationListeners() { - if (controllerInstantiationListeners == null) { - controllerInstantiationListeners = new ControllerInstantiationListenerList(); - } - - return controllerInstantiationListeners; - } - - public ControllerInitializationListenerList getControllerInitializationListeners() { - if (controllerInitializationListeners == null) { - controllerInitializationListeners = new ControllerInitializationListenerList(); - } - - return controllerInitializationListeners; - } - - public ControllerInvokeListenerList getControllerInvokeListeners() { - if (controllerInvokeListeners == null) { - controllerInvokeListeners = new ControllerInvokeListenerList(); - } - - return controllerInvokeListeners; - } - public ControllerRouteFactory getControllerRouteFactory() { if (!controllerRouteFactory.isPresent()) { - controllerRouteFactory = Optional.of(new DefaultControllerRouteFactory() - .setContentTypeEngines(getContentTypeEngines()) - .setControllerHandlerFactory(controllerHandlerFactory)); + controllerRouteFactory = Optional.of(new DefaultControllerRouteFactory().setContentTypeEngines(getContentTypeEngines())); } - return controllerRouteFactory; + return controllerRouteFactory.get(); } public ControllerApplication setControllerRouteFactory(ControllerRouteFactory controllerRouteFactory) { From b6534b7858141cbe84baa9c62799e45884f93c16 Mon Sep 17 00:00:00 2001 From: Dwouglas Mhagnum Date: Wed, 1 Dec 2021 22:02:59 -0300 Subject: [PATCH 11/12] [AbstractTemplateEngine] Add @Inject on init method --- .../src/main/java/ro/pippo/core/AbstractTemplateEngine.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pippo-core/src/main/java/ro/pippo/core/AbstractTemplateEngine.java b/pippo-core/src/main/java/ro/pippo/core/AbstractTemplateEngine.java index ddc15d048..3f76b260d 100644 --- a/pippo-core/src/main/java/ro/pippo/core/AbstractTemplateEngine.java +++ b/pippo-core/src/main/java/ro/pippo/core/AbstractTemplateEngine.java @@ -20,6 +20,8 @@ import java.util.Locale; +import javax.inject.Inject; + /** * Convenience abstract implementation of {@link TemplateEngine}. * @@ -44,6 +46,7 @@ public abstract class AbstractTemplateEngine implements TemplateEngine { * and other settings for the initialization */ @Override + @Inject public final void init(Application application) { this.application = application; } From c696f78a62f8f9dc7dd51259db479904ee5eaf5f Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Wed, 22 Dec 2021 21:53:32 +0200 Subject: [PATCH 12/12] Fix merge conflict --- .../main/java/ro/pippo/core/Application.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pippo-core/src/main/java/ro/pippo/core/Application.java b/pippo-core/src/main/java/ro/pippo/core/Application.java index 066130029..46ef54b38 100644 --- a/pippo-core/src/main/java/ro/pippo/core/Application.java +++ b/pippo-core/src/main/java/ro/pippo/core/Application.java @@ -17,6 +17,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ro.pippo.core.entity.DefaultEntityRequestEngine; +import ro.pippo.core.entity.EntityRequestEngine; import ro.pippo.core.gzip.GZipRequestResponseFactory; import ro.pippo.core.route.DefaultRouter; import ro.pippo.core.route.ResourceRouting; @@ -69,6 +71,9 @@ public class Application implements ResourceRouting { @Inject private Optional engines = Optional.empty(); + @Inject + private Optional entityRequestEngine = Optional.empty(); + @Inject private Optional requestResponseFactory = Optional.empty(); @@ -258,6 +263,18 @@ public ContentTypeEngine getContentTypeEngine(String contentType) { return getContentTypeEngines().getContentTypeEngine(contentType); } + public EntityRequestEngine getEntityRequestEngine() { + if (!entityRequestEngine.isPresent()) { + entityRequestEngine = Optional.of(new DefaultEntityRequestEngine(getContentTypeEngines())); + } + + return entityRequestEngine.get(); + } + + public void setEntityRequestEngine(EntityRequestEngine entityRequestEngine) { + this.entityRequestEngine = Optional.of(entityRequestEngine); + } + public Router getRouter() { if (!router.isPresent()) { router = Optional.of(new DefaultRouter());