When we want to transform a Promise
value we can use the map
and flatMap
methods.
There are also variants to this methods that will only transform a value when a given predicate is true: mapIf
and flatMapIf
.
We provide a predicate and function to the methods.
If the predicate is true the function is invoked, otherwise the function is not invoked and the promised value is returned as is.
In the following example we have two methods that use the mapIf
and flatMapIf
methods of the Promise
class:
Continue reading →
The Promise
class has a lot of methods.
One of the methods is the time
method.
We can invoke this method an a Promise
instance.
The method creates a Duration
object that we can use inside the method.
The duration is the time taken from when the promise is subscribed to to when the result is available.
The promise value is not changed, so we can add the time
method at any position of a method chain for the Promise
object.
In the following specification we check the duration for a Promise
that is returned by the method generate
of the class Numbers
.
For our example we wait for a number of seconds dependent on the argument of the generate
method.
In the specification we use the time
method and check the time spent to fulfil the promise.
Continue reading →
To run external Groovy scripts in our Java or Groovy application is easy to do.
For example we can use GroovyShell
to evaluate Groovy code in our applications.
If our script contains print methods like println
we can redirect the output of these methods.
The Script
class, which is a base class to run script code, has an implementation for the print
, printf
and println
methods.
The implementation of the method is to look for a property out
, either as part of a Script
subclass or in the binding added to a Script
class.
If the property out
is available than all calls to print
, printf
and println
methods are delegated to the object assigned to the out
property.
When we use a PrintWriter
instance we have such an object, but we could also write our own class with an implementation for the print
methods.
Without an assignment to the out
property the fallback is to print on System.out
.
In the following example we have a external script defined with the variable scriptText
, but it could also be a file or other source with the contents of the script we want to run.
We assign our own PrintWriter
that encapsulates a StringWriter
to capture all invocations to the print
methods:
Continue reading →
In a previous post we saw how we can use Spring Boot in a Ratpack application.
But the integration can also be the other way around: using Ratpack in a Spring Boot application.
This way we can use Ratpack’s power to handle requests sent to our Spring Boot application and still use all Spring Boot features in our application.
The easiest way to add Ratpack to a Spring Boot application is adding a Ratpack dependency and use the @EnableRatpack
annotation.
With this annotation a RatpackServer
instance is created and started along with configuration options.
Let’s see an example Spring Boot application with Ratpack enabled.
First we add Ratpack as dependency to our Spring Boot application.
In our example we also add Ratpack’s Dropwizard module as dependency. We use Gradle in our example:
Continue reading →
When we start a Spring Boot application and pass arguments to the application, Spring Boot will capture those arguments and creates a Spring bean of type ApplicationArguments
and puts it in the application context.
We can use this Spring bean to access the arguments passed to the application.
We could for example auto wire the bean in another bean and use the provided argument values.
The ApplicationArguments
interface has methods to get arguments values that are options and plain argument values.
An option argument is prefixed with --
, for example --format=xml
is a valid option argument.
If the argument value is not prefixed with --
it is a plain argument.
In the following example application we have a Spring Boot application with a Spring bean that implements CommandLineRunner
.
When we define the CommandLineRunner
implementation we use the ApplicationArguments
bean that is filled by Spring Boot:
Continue reading →
When we write a Spring Boot application a lot of things are done for us.
For example when an exception in the application occurs when we start our application, Spring Boot will exit the application with exit code 1
.
If everything goes well and the we stop the application the exit code is 0
.
When we use the run
method of SpringApplication
and an exception is not handled by our code, Spring Boot will catch it and will check if the exception implements the ExitCodeGenerator
interface.
The ExitCodeGenerator
interface has one method getExitCode()
which must return a exit code value.
This value is used as input argument for the method System.exit()
that is invoke by Spring Boot to stop the application.
In the following example application we write a Spring Boot command line application that can throw an exception on startup.
The exception class implements the ExitCodeGenerator
interface:
Continue reading →
Testing a Ratpack application is not difficult.
Ratpack has excellent support for writing unit and integration tests.
When we create the fixture MainClassApplicationUnderTest
we can override the method addImpositions
to add mock objects to the application.
We can add them using the ImpositionsSpec
object.
When the application starts with the test fixture the provided mock objects are used instead of the original objects.
For a Groovy based Ratpack application we can do the same thing when we create the fixture GroovyRatpackMainApplicationUnderTest
.
We start with a simple Java Ratpack application.
The application adds an implementation of a NumberService
interface to the registry.
A handler uses this implementation for rendering some output.
Continue reading →
We have several options to define a Ratpack application.
We can use a Java syntax to set up the bindings and handlers.
Or we can use the very nice Groovy DSL.
It turns out we can use both together as well.
For example we can define the handlers with the Groovy DSL and the rest of the application definition is written in Java.
To combine both we start with the Java configuration and use the bindings
and handlers
method of the Groovy.Script
class to inject the files with the Groovy DSL.
We start with a sample application where we use Java configuration to set up our Ratpack application:
Continue reading →
One of the very nice features of Ratpack is the Groovy DSL to define our application.
We get a nice DSL to set up the registry, to define handlers and more.
Because of clever use of the @DelegateTo
annotation we get good code completion in our IDE.
We can also add static compilation of our Groovy DSL when we start our Ratpack application.
With static compilation the script is type checked at compile time so we get earlier feedback on possible errors in the script.
To configure static compilation we must invoke the app
method of the Groovy.Script
class with the argument true
.
We start with a Groovy DSL for an application that serves recipes.
Notice the Closure
arguments are all typed, so with type checking there are no errors.
Continue reading →
Ratpack uses renderers to render output. We can create our own renderer by implementing the Renderer
interface.
The renderer class needs to implement a render
method that has the object we want to render as argument.
Alternatively we can add the logic to render a object to the class definition of that object.
So instead of having a separate renderer class for a class, we add the render logic to the class itself.
To achieve this we must implement the Renderable
interface for our class.
Ratpack provides a RenderableRenderer
in the registry that knows how to render classes that implement the Renderable
interface.
In the following example we have a Recipe
class that implements the Renderable
interface:
Continue reading →
We can open a Gradle project in IntelliJ IDEA and get support for Gradle inside IntelliJ.
Sometimes we need to refresh the project in IntelliJ IDEA, for example when we add a new dependency or plugin in our Gradle build file.
We need to refresh the Gradle project so IntelliJ IDEA can work with the changes.
The Gradle tool window has an icon to Refresh all Gradle projects.
But this means a mouse action and we want to have a shortcut key so we can leave our hands on the keyboard.
The action Refresh all Gradle projects is actually the action Refresh all external projects.
We can add keyboard shortcut key via Preferences | Keymap. We use the search box to search for Refresh all external projects
.
Continue reading →
Ratpack has parsers to parse a request with a JSON body or a HTML form. We simply use the parse
method of Context
and Ratpack will check if there is a compliant parser in the registry.
If there is a parser for that type available then Ratpack will parse the request and return a Promise
with the value.
To write a new parser we need to implement the Parser
interface.
The easiest way to implement this interface is by writing a class that extends ParserSupport
.
Using the ParserSupport
class we can also work with an options object that a user can pass on to the parse
method of Context
.
If we don’t need options we can also extend the NoOptParserSupport
class.
Let’s write a custom parser that can parse a request with a hex or base64 encoded value.
The parser returns a String
object with the decoded value.
In our example we also want the user to provide an optional options object of type StringParserOpts
which denotes the type of decoding:
Continue reading →