thumbnail

I'd like to share with you my current procedure, with some manual steps, to create a quarterly release workspace in Liferay Dev Studio. Update blade In a command line window, run blade update. Create a Liferay Workspace Quarterly releases do not appear in the dropdown. Just pick any Liferay DXP 7.4 version and don't download the bundle. Update settings.gradle ...

thumbnail

Liferay DXP 7.4 introduced objects: https://learn.liferay.com/web/guest/w/dxp/liferay-development/objects Objects make it possible to define custom entities in Liferay: you name the objects, their fields, their relationship and Liferay generates the database tables and the APIs. Once your objects have been published, you can define custom back-office object management screens...

thumbnail

I've recently been involved in an investigation regarding an issue with the Azure Blob Storage DL Store connector. One of my concern was the reproduction of the issue. Meet Azurite: https://github.com/Azure/Azurite Azurite is an Azure emulator which supports Azure Blob Storage, Queue and Tables. As far as Liferay is concerned, it's Azure Blob Storage we are interested...

thumbnail

In a recent article, I explained how you can setup glowroot to have some great APM capabilities to monitor Liferay: https://liferay.dev/blogs/-/blogs/setting-up-glowroot-apm From time to time, I got to help customers understanding failures in their database upgrade from one Liferay version to a new one. The logs for upgrade can be very long and difficult to analyze. I've just...

thumbnail

I've been frequently involved in projects where I had to deal with performance issues. I knew there were many commercial APM solutions but I wanted to check whether there was some free alternative that I could use both on my developer workstation and on the project's infrastructure. This is how I came across https://glowroot.org. Glowroot is a Java Application Performance...

thumbnail

I've often been asked whether we can process additional UserInfo data from an OpenId Connect session after successful log in. I used to share this piece of code where I had my way to access the OpenIdConnect Session object in order to retrieve the Access Token Liferay obtained in order to fetch additional info: https://github.com/fabian-bouche-liferay/oidc-userinfo-mapping/ However, last...

thumbnail

The Apache Log4j project is now saying that setting -Dlog4j2.formatMsgNoLookups=true is not a 100% guarantee that you are protected from exploits. I think that currently no one has found a way to exploit the vulnerability on Liferay with -Dlog4j2.formatMsgNoLookups=true set but many prefer to be extra safe. As it has been stated before, you're likely to find log4j2 in DXP...

thumbnail

The landscape for Identity and Access Management has changed over the years. Whereas in the past, we'd often rely on proprietary or home grown solutions, we can now largely rely on well established standards. Setting up Single Sign On has become easier as many SaaS providers offer some free plans and there is even easy-to-use software out there. In this article, I'm going to show you how you...

thumbnail

This blog post is the second of a series I've just started. The previous one dealt with some recipes to deal with backend REST APIs integration, using Swagger Codegen, Retrofit and showcasing Portlet's 3.0 PortletAsyncContext in order to manage web service calls in an asynchronous fashion, so as to reduce the footprint of our code on the Thread Pool. This second blog post now deals with...

thumbnail

With this first blog, I'd like to start a series about application integration. Quite often, I encounter projects where Liferay must integrate with some backend services. There are lots of integration patterns. Integration may happen at browser or server side. There are many development frameworks available (React, Vue, MVC Portlet, Liferay Faces, Spring MVC Portlet...) Communication with...

thumbnail

You've just written some custom implementation for a Liferay Service but your implementation is not picked from inside of the bundle that should use it despite the higher service ranking. @Component( immediate = true, property = { "service.ranking:Integer=100" }, service = AssetPublisherHelper.class ) public class...