terça-feira, 22 de outubro de 2019

What is the final solution to reuse code in JAX-RS resources?

Back in 2008 I was in college and had to finish my graduation thesis, which was about mashing Web applications. At that time that great news was REST and it was in WAR with SOAP! I came across Roy Fielding famous dissertation, read RESTful Web Services, the book that speed up truly REST APIs (we had data update with GET back then!) in the WEB and then I stated calling myself a RESTAFarian.

Figure 5-3: The client-stateless-server style
"Stateless architectures will never work" - said some SOAP lover 10 years ago 
And I was also a Java programmer! However, back then create REST services for Java was not easy. We had to use servlets and JAX-RS was still in its early days and we already had Restlet! However, JAX-RS was the best solution: annotation based, truly REST language and more. I decided to use Jersey and Spring for my thesis. (the only time I used it, after I felt in love with RESTEasy and have been using it since then).

I liked JAX-RS since 10 years ago I have to repeat code, like check nullable entities and return 404, create entities and build the URI, check if parent resources are found before getting the list of child resources and so on... The basic solution is distribute WebApplicationException throws, then create an exception mapper to create a suitable response when such exception is caught... That's not elegant nor easy to maintain.

Well, at this point, if you came here looking for a solution, well, I don't have it. I mean, I try different approaches, see all these bad ideas I had:

The list would go on, but I want to quickly introduce the new approach I am working one, see this GIST:

The methods from RESTUtils classes allow us to verify a given object and then run some code that will verify a given entity and do other action to build the response. For example, the method checkEntityAndUpdate is useful when you are updating an object, but first you must verify if it is not null (more specifically because PanacheEntity.findById returns null), if it is null 404 is returned, otherwise the consumer propsUpdate can be used to update some of attached object, and this is very important. This is easy to read and helpful, but still we need to repeat some code. With Quarkus and Panache I started an abstract class which was supposed to transform entities operations into suitable HTTP responses, letting us focus on HTTP mapping to our resource methods, but I faced a bug and gave up for now.

The question on this post title remains: What is the final solution to reuse code in JAX-RS resources? What do you use to avoid repeating code? An utility class? A magical framework? Please let me know!

quinta-feira, 19 de setembro de 2019

Hello World, Kogito!

Kogito is what you need to bring business automation to the cloud!

Kogito Quarkus extension allows you to build applications on top of quarkus, bringing native business applications, developer joy and multiple useful extensions that can be used along with Kogito.

Here are some interesting links for you to get started with Kogito:

Kogito Get Started Guide

Kogito Quarkus Extension Guide

Kogito Examples

Kogito Tooling Installation

Kogito + Quarkus on VS Code Tutorial

If you are a video person there's also this:

Wondering about where Kogito came from? Read this blog from Kris.

Happy Coding!

quinta-feira, 7 de março de 2019

Hello World, Quarkus!

Today JBoss community released Quarkus. I could not wait to test it. Projects can be generated using the following archetype:

mvn io.quarkus:quarkus-maven-plugin:0.11.0:create      \
    -DprojectGroupId=org.fxapps                        \
    -DprojectArtifactId=quarkus-getting-started        \
    -DclassName="org.fxapps.GreetingResource"          \

With the project that was generated you can create native binaries and docker images from it. See the following video for a quick demo of a hello world application:

quinta-feira, 1 de novembro de 2018

Adding dynamic properties to a Javascript object in a GWT + JSInterop context

GWT is a framework that allows you to program the user interface of your application in Java and later it is compiled to Javascript, which will work across all browsers. The main advantage is that you don't have to care about minification of Javascript and compatibility across browsers, easy communication with server side and it is Java, you can use Java on server and client side. With Errai you have CDI (and more) on the client side, which means that you can make your application flexible and create pluggable components.
GWT in its later versions introduced JSInterop, a great way to call Javascript using Java. During the compilation the Java bean will be compiled to an equivalent Javascript code. This is good for Javascript objects with static properties, but knowing Javascript you will always find cases where the attribute name is dynamic, where the attribute is created "on the fly", for example:

var myObject = {
    someAttributeIJustCreated : "the value"

In Javascript myObject is a valid type, but this is not how things work with Java. During Javascript development it is handy to use such types and in some Javascript APIs you can't run away from it, for example, in C3.js to map a data X value you must create an attribute with the name of the column matching the column name where the X values will be found. To better understand this see the simple_multiple_xy.js example:


var chart = c3.generate({
    data: {
        xs: {
            data1: 'x1',
            data2: 'x2',
        columns: [
            ['x1', 10, 30, 45, 50, 70, 100],
            ['x2', 30, 50, 75, 100, 120],
            ['data1', 30, 200, 100, 400, 150, 250],
            ['data2', 20, 180, 240, 100, 190]

Notice that to tell that data1 x will x1 we will need to have an attribute of type data1. If you know the API you will see that data1 could be a String, but that I don't know how to map.
How do we map such cases using JSInteorp? After looking for it quite a while I found this github discussion and then the solution was simple:

* Make the attribute of type elemental2.core.JsObject
* Use the following code to create dynamic attributes:

JsObject jsObject = JsObject.create(null);
       .set("someCustomProperty", "someCustomValue");

And that's it! You can have properties of type JsObject in any object anotated with JsType, for example, if I want to create xs attributewith dynamic attributes (see the c3 object above), I can declare a property as follows:

    public native void setXs(JsObject xs);

See you in next post.