Middleware & integrations

servizi mw

More and more organizations are using multiple systems, both internal and external to the company, to meet the needs of individual departments or specific product sectors. The range of requests includes tools for time attendance, CRMs to manage customers, ERP systems to record invoices, order reception, and so on.
The prevalent lack of standardized and shared data among the various existing applications requires managing heterogeneous data sets and performing mapping and correlation logic. This leads management to seek business support solutions.
This type of scenario can be resolved by using a Middleware Layer for management, capable of addressing this lack and reorganizing the reception/sending of data between applications by customizing the mapping as required by each application. It replaces the missing translation between data without modifying the structure of the applications as they are (AS IS).

How middleware works: management through APIs

Middleware and integration frameworks, in general, are software components designed to connect separate systems, transferring data between applications and allowing them to work together synergistically. They essentially act as intermediaries, bridging and translating between autonomous services.

Middleware developers must be able to eliminate information incompatibility while enhancing its value. This requires a strong ability to analyze the correct interoperability of data, ensuring the execution of true distributed systems.

The functionalities of middleware systems are typically accessed through Application Programming Interfaces (APIs), interfaces that allow two or more applications to communicate with each other.

The Extra Red team can help you manage API systems by providing an Enterprise-level service through the use of an API Management Layer, which enables external clients to securely consume functionalities exposed by a cloud application. To achieve this, an API usage contract must be defined and published in a catalog, making them accessible, reusable, and searchable.

Why develop a new functionality from scratch within the company's application portfolio when an existing API can provide it? Middleware guarantees all of this by adapting to the company's systems..

Middleware services you can't do without

For many years, at Extra Red, we have been carrying out integration projects in various areas, including:

  • Application interoperability
  • Business process management and optimization
  • Development of microservices architectures (MSA) designed using modular architectural approaches.

We work as excellent interpreters who not only perform basic translations but also mediate between different technological cultures to make information from distinct platforms understandable and coherent.

We can help you flow information between the various software applications within your organization, creating specific functionalities that allow you to access control from a single environment, guaranteeing:

  • Continuous data updates
  • Improved service maintenance management
  • Identification of data management bottlenecks between applications
  • Custom correlation between heterogeneous data
  • Data transaction security
  • Robust architectures on scalable systems
  • Business process management and control.

servizi mw

Are you interested in learning more about our technologies? Write to us!


Web & mobile applications and DXPs

DXP technology image

Today, web users are becoming more and more demanding. When they surf online, they move quickly from an environment to the other, requiring simplicity and fluency. Often, the value they perceive in an application isn’t aligned with the functions the application provides. A messy interface, a counterintuitive browsing, some unattractive graphics; these are all factors that can push even a well-built, strong and scalable application out of the market. If you want users to choose your application and you wish them to be satisfied by it and keep using it, you need to have a well-finished interface in order to make the most of the modern digital channels (web, mobile, social media) and to increase value for the users who interact with them.

Digital Experience Platforms

The need to satisfy the demands of those new users always looking for intense, customized experiences led to the birth of DXPs (Digital Experience Platforms) as an evolution of CMS platforms. Gartner defines DXPs as “an integrated and cohesive piece of technology designed to enable the composition, management, delivery and optimization of contextualized digital experiences across multiexperience customer journeys”. Therefore, DXPs are systems created not only for managing digital content, but also for handling the ongoing changes, in a context of technological innovation and with an approach that’s becoming more and more multi-channel and multi-device, needing to focus on the customer experience regardless of their interaction touchpoint (website, mobile app, e-commerce). These platforms can integrate specific functions such as:

  • Document Management: it allows to add, modify and update documents and text or graphic content within the portal;
  • Analytics: it allows to represent data graphically through smart searching, dashboards, and interactive reports;
  • Experience Management: it allows to manage the customer’s experience and find opportunities for improvement by monitoring their interactions.

We make your customer's experiences unique

Today, web applications, mobile applications and portals that can aggregate services and content represent the natural completion of the large distributed architectures, powerful and scalable. Due to the vast landscape of languages, frameworks and tools populating the IT world nowadays, it’s understandable how the creation of such components requires strong tech knowledge but also understanding of the client’s needs and a strong preparation in the field of digital communication. We at Extra Red, with our many years of experience, can improve your clients’ Digital Experience as well as allow you to reach a broader range of users. We are the ideal partners: we combine different expertise and we are able to create customized, complete solutions, such as:

  • Customer Service Portal: for digitalizing customer services and improving the Customer Experience;
  • Product Service Portal: for digitalizing the product lifecycle and monitoring the production process;
  • Enterprise Service Portal: for digitalizing the business processes and improving the operational efficiency;
  • Intranet Portal: for allowing employees to rapidly find the information they need, therefore increasing their productivty and efficiency. 

DXP technology image

Are you interested in learning more about our technologies? Write to us!


Big Data, Business Intelligence & AI

AI Services

The world of IT is constantly changing. We see the birth of innovations almost every day. In the last few years, however, no innovation has been more groundbreaking than the coming of Big Data and Artificial Intelligence, technologies that were already on the table, but that have started to be exploited in their full potential only recently.

What are Big Data?

Data are the essence of the world of IT. All programs and applications are based on the storage and elaboration of data. In the past ten years, though, also as a result of user-generated content (just think about all the information injected every day into social media platforms), internet data have become so many that a structured approach for elaborating them was needed. This approach has subsequently become an actual discipline: the science of Big Data.

Turn your data into strategic information

Data can “speak”. They can tell us things we didn’t know before. That’s why their value can become essential. But in order to exploit data, we have to know how to interpret them. For example, let’s consider an e-commerce application tasked with managing orders, or a management software that controls the workload of a production business. The data generated by these systems can be used to conduct various analyses, from the accurate prediction of sales peaks and declines to the prediction of customer needs. We at Extra Red can become your oracle. With our Business Intelligence (BI) services, we can extract considerable amounts of information from different sources and transform simple data in real knowledge. We can create analyses, reports and sophisticated dashboards to help you undertake the best strategies, operate with a deeper understanding and test market tendencies in advance. 

Artificial Intelligence and Natural Language Processing

Artificial Intelligence (AI) is also based on data, and it finds its strongest expression in Machine Learning, the science that deals with creating systems which can learn autonomously based on the information provided. Today, AI is used in numerous fields: it can identify production faults before products are released, it can detect human faces, it can support doctors in advanced cancer study and much more. In production facilities, AI systems can, among other things, undertake repetitive activities and make routine tasks automatic. If today we are able to carry out banking operations or interact with our car through vocal commands, we owe it to Artificial Intelligence and, in particular, to one of its branches called Natural Language Processing (NLP), that we at Extra Red use to analyze big quantities of language and which allows us, through voice recognition and lexical analysis, to enrich the conversational ability of next-gen virtual assistants to offer assistance 24/7.

AI Services

Are you interested in learning more about our technologies? Write to us!


Cloud, DevOps & Automation

Cloud services

Cloud technology allows to elaborate and store data outside traditional on-premise data centers, thus enabling delivery and use of computing resources on-demand through the Internet. Today, the Cloud is widely regarded as the fundamental ingredient of Digital Transformation, the crucial element in a business strategy that aims for growth and fast scalability while keeping costs low. No physical infrastructure, in fact, means less costs for buying hardware, maintaining it, and paying for IT personnel.

Optimizing processes thanks to the Cloud

For us at Extra Red, the Cloud isn’t just a physical place. It’s also a synonym for improvement, automation, application modernization. We are “Cloud Enablers”: we can create and maintain your Cloud environment (be it public, private, or hybrid), but we don’t just stop there. Migrating applications to the Cloud without transforming them appropriately makes no sense, therefore we shall also accompany you throughout each stage of the change and help you fully take advantage of this technology’s potential, by developing cloud-native applications, applications based on microservices and containerized applications. The foundation of this paradigm is the concept of “container”, that is, the set of source code which contains everything that’s needed to be deployed in any environment, and which can be migrated, transformed, and maintained independently from the other containers that make up an application. Every modern application built for the Cloud is made of multiple containers. When there are many containers, an orchestrator is needed. At Extra Red we use Red Hat OpenShift, the best “cloud operative system” available on the marketplace. Being extremely compatible, Red Hat OpenShift allows companies to install their applications regardless of the underlying physical, virtual or cloud environment. It also helps avoid cloud provider lock-ins and it’s essential when developing applications for hyperscalers such as AWS, Azure, Google.

Infrastructure management and DevOps synergy

The modern Cloud infrastructure management includes creating platforms that can manage a software application’s entire lifecycle, from coding to operations such as maintenance and monitoring. Such platforms are able not only to support application runtime, but can also offer a set of services essential to developers because usable on a self-service basis. By adopting this point of view, it’s easy to see that a tight collaboration between modern system administrators (ops) and developers responsible for an application’s lifecycle (dev) is born. Hence the DevOps methodology, a way to allow companies to drastically lower the Time-To-Market of applications and services and at the same time increase their reliability. Thanks to this method, building automation for routine activities becomes easier, enabling developers and operation teams to deploy them by using software suites when needed. This way, manual activities are reduced and business processes speed up considerably.

Cloud services

Are you interested in learning more about our technologies? Write to us!

An error occurred while processing the template.
Failed to "?eval" string with this error:

Syntax error in ?eval-ed string in line 1, column 2:
Encountered ")", but was expecting one of:

The failing expression:
==> entitiesListJson?eval  [in template "20097#20123#53602" at line 67, column 21]

FTL stack trace ("~" means nesting-related):
	- Failed at: #assign entities = entitiesListJson?eval  [in template "20097#20123#53602" at line 67, column 1]
1<#-- Blog Index Argomento ADT --> 
2<#assign portletBackground = "bg-red-white" /> 
3<#list portletPreferences?keys as key> 
4    <#if key=="portletBackground"> 
5        <#assign portletBackground=portletPreferences[key]?first /> 
6    </#if> 
9<#assign dlAppServiceUtil = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService")/> 
10<#assign categoryService = serviceLocator.findService("it.extrared.redweb.commons.service.CategoryService") /> 
11<#assign assetCategoryPropertyLocalService = serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService") /> 
12<#assign assetEntryLocalService=serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") /> 
13<#assign dlFileEntryService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService') /> 
15<#assign contentTopic = languageUtil.get(locale, "content-topic") /> 
16<#assign noArticle = languageUtil.get(locale, "no-article") /> 
17<#assign readMore = languageUtil.get(locale, "read-all") /> 
19<#assign redSimilarJournalArticle = serviceLocator.findService("it.extrared.redweb.commons.service.SimilarJournalArticle") /> 
20<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
22<#assign article = "" /> 
23<#assign urlTitle = "" /> 
25<#assign dirtyUrlTitle = themeDisplay.getURLCurrent() /> 
26<#if dirtyUrlTitle?contains("curPage")> 
27    <#assign curPage = paramUtil.getString(request, "curPage")?number /> 
28    <#assign last = dirtyUrlTitle?split("/")?last /> 
29    <#assign urlTitle = last?substring(0, last?index_of("?")) /> 
30<#elseif dirtyUrlTitle?contains("?wkrh___tabs1=properties")>  
31    <#assign curPage = 1 /> 
32    <#assign last = themeDisplay.getURLCurrent()?split("/")?last /> 
33    <#assign urlTitle = last?substring(0, last?index_of('?wkrh___tabs1=properties')) /> 
34<#elseif dirtyUrlTitle?contains("_redirect")> 
35    <#assign curPage = 1 /> 
36    <#assign urlTitle = dirtyUrlTitle?split("/")?last /> 
38    <#assign curPage = 1 /> 
39    <#assign urlTitle = dirtyUrlTitle?split("/")?last /> 
43    <#assign article = journalArticleLocalService.getArticleByUrlTitle(groupId, urlTitle) /> 
44    <#recover>   
47<#assign entitiesListJson = "" /> 
48<#assign total = 0 /> 
49<#assign delta = 0 /> 
51<#list portletPreferences?keys as k > 
52    <#if k == "delta"> 
53        <#assign delta = portletPreferences[k]?first?number /> 
54    </#if> 
57<input type="hidden" value="${curPage}" id="custom-curPage"/> 
59<#if article?? && article?has_content> 
60    <#assign entitiesListJson = redSimilarJournalArticle.getSimilarJournalArticlesWithConfig(portletPreferences, article.articleId, groupId, false, curPage?number) /> 
61    <#assign total = redSimilarJournalArticle.getSimilarJournalArticleCount(portletPreferences, article.articleId, groupId) /> 
64<#assign totalPages = (total/delta)?ceiling /> 
66<input type="hidden" value="${totalPages}" id="custom-totalPages"/> 
67<#assign entities = entitiesListJson?eval /> 
69<#if entities?has_content && entities?size gt 0> 
70    <section class="container-fluid ${portletBackground} custom-scroll-class" id="custom-scroll-class"> 
71        <div class="container col-xxl-12"> 
72            <div class="row"> 
73                <div class="col-12"> 
74                    <div class="row align-items-center"> 
75                        <div class="col-lg-4 col-12"> 
76                            <span class="pb-5 text-muted">${contentTopic?upper_case}</span> 
77                        </div> 
78                    </div> 
79                </div> 
80            </div> 
81        </div> 
82    </section> 
84    <section class="container-fluid pt-0 ${portletBackground}"> 
85        <div class="container"> 
86            <div class="row align-items-center pt-lg-5"> 
87                <#list entities?keys as k> 
88                    <#assign entitiesGroup=entities[k] /> 
89                    <#if entitiesGroup?size gt 0> 
90                        <#list entitiesGroup as array> 
91                            <div class="col-lg-4 mb-5"> 
92                                <#assign titolo = array["articleTitle"] /> 
93                                <#assign articleId = array["articleId"] /> 
94                                <#assign singleArticle = journalArticleLocalService.fetchArticle(groupId, articleId) /> 
95                                <#assign categories = array["categoriesString"] /> 
96                                <#assign displayPage = array["displayPage"] /> 
97                                <#assign assetEntryId = array["assetEntryId"] /> 
98                                <#assign assetEntry = assetEntryLocalService.getEntry(assetEntryId) /> 
99                                <#assign categories = assetEntry.getCategories() /> 
100                                <#assign urlImage = "" /> 
101                                <#assign altImage = "" /> 
102															  <#assign fileEntryId = "" /> 
103                                <#if array["image"]?? && array["image"]?has_content> 
104                                    <#assign docVal=array["image"]?eval /> 
105                                    <#if docVal.url?? && docVal.url?has_content> 
106                                        <#assign urlImage = docVal.url /> 
107                                    </#if> 
108                                    <#if docVal.title?? && docVal.title?has_content> 
109                                        <#assign altImage = docVal.title /> 
110                                    </#if> 
111																	  <#if docVal.fileEntryId?? && docVal.fileEntryId?has_content> 
112                                        <#assign fileEntryId = docVal.fileEntryId /> 
113                                    </#if> 
114                                    <div class="col-lg-9 col-9 col-sm-9 p-0"> 
115																			<@adaptive_media_image["img"]  
116                                         fileVersion=dlAppServiceUtil.getFileEntry(fileEntryId?number).getFileVersion()  
117																			   width="100%"  
118																				 height="auto" 
119																				 alt="${altImage}" 
120																				 class="mb-4" 
121																			 /> 
122																				<#-- 
123                                        <img width="100%" class="mb-4" height="auto" src="${urlImage}" alt="${altImage}" title="${titolo}"> 
124																			--> 
125                                    </div> 
126                                </#if> 
127                                <#-- 
128                                <#list categoriesList as c> 
129                                    <#attempt> 
130                                        <#assign typeProperty = assetCategoryPropertyLocalService.fetchCategoryProperty(c.categoryId?long, "type") /> 
131                                        <#if typeProperty?? && typeProperty?has_content> 
132                                            <#assign type = typeProperty.getValue() /> 
133                                            <#if type?? && type?has_content> 
134                                                <div class="badge badge-pill badge-primary bg-red-red">${c.getTitle(locale)}</div> 
135                                            </#if> 
136                                        </#if> 
137                                        <#recover> 
138                                    </#attempt> 
139                                </#list> 
140                                --> 
141                                <div class="card-body pt-2"> 
142                                    <div class="card-subtitle text-muted"> 
143                                    <#list categories as c> 
144                                      <#--   
145																			<#attempt> 
146                                            <#assign typeProperty = assetCategoryPropertyLocalService.fetchCategoryProperty(c.categoryId?long, "type") /> 
147                                            <#if typeProperty?? && typeProperty?has_content> 
148                                                <#assign type = typeProperty.getValue() /> 
149                                                <#if type?? && type?has_content> 
150                                                    ${c.getTitle(locale)?upper_case} 
151                                                </#if> 
152                                            </#if> 
153                                        <#recover> 
154                                        </#attempt> 
155																			--> 
156																			<#assign hasProperty = categoryService.hasCategoryProperty(c.getCategoryId(), "type") /> 
157																			<#if hasProperty> 
158																					<#assign typeProperty = categoryService.getCategoryProperty(c.getCategoryId(), "type") /> 
159																					<#if typeProperty?? && typeProperty?has_content && typeProperty == "true"> 
160																							${c.getTitle(locale)?upper_case} 
161																					</#if> 
162																			</#if> 
163                                    </#list> 
165                                        <#-- 
166                                        ${singleArticle.getDDMStructure().getName(locale)?upper_case} 
167                                        --> 
168                                    </div> 
169                                    <#-- 
170                                    <#if categoriesList?? && categoriesList?has_content> 
171                                        <div class="card-subtitle text-muted"> 
172                                            <#assign categoriesString = "" /> 
173                                            <#list categoriesList as c> 
174                                                <#attempt> 
175                                                    <#assign typeProperty = assetCategoryPropertyLocalService.fetchCategoryProperty(c.categoryId?long, "type") /> 
176                                                    <#recover> 
177                                                    <#if !categoriesString?has_content> 
178                                                        <#assign categoriesString = c.getTitle(locale)?upper_case /> 
179                                                    <#else> 
180                                                        <#assign categoriesString = categoriesString + ", " + c.getTitle(locale)?upper_case /> 
181                                                    </#if> 
182                                                </#attempt> 
183                                            </#list> 
184                                            ${categoriesString} 
185                                        </div> 
186                                        <div class="card-subtitle text-muted"> 
187                                            ${categories?upper_case} 
188                                        </div> 
189                                    </#if> 
190                                    --> 
191                                    <a href="${displayPage}" target="_self" title="${titolo}"> 
192                                        <h3 class="m-0">${titolo}</h3> 
193                                    </a> 
194                                </div> 
195                            </div> 
196                        </#list> 
197                    <#else> 
198                        <div class="container"> 
199                            <h2 class="m-0 color50percent">${noArticle}</h2> 
200                        </div> 
201                        <a class="pt-5 align-middle" style="display: block" href="/blog"> 
202                            <i class="align-middle me-2 material-icons-outlined">explore</i> 
203                            <span class="align-middle">${readMore?capitalize}</span> 
204                        </a> 
205                    </#if> 
206                </#list> 
207            </div> 
208        </div> 
210        <div class="lfr-pagination custom-pagination"> 
211          <ul class="lfr-pagination-buttons pagination"> 
212            <li class="page-item"> 
213              <a class="custom-pagination-prec <#if curPage == 1> disabled </#if>"> 
214                                <span class="material-symbols-outlined" style="vertical-align: middle; padding-left: 5.0px;">arrow_back_ios</span> 
215                            </a> 
216            </li> 
217            <li class="page-item"> 
218              <a class="custom-pagination-succ <#if curPage == totalPages> disabled </#if>"> 
219                              <span class="material-symbols-outlined" style="vertical-align: middle; padding-left: 5.0px;">arrow_forward_ios</span> 
220                            </a> 
221            </li> 
222          </ul> 
223        </div> 
225    </section>