SlideShare a Scribd company logo
1 of 98
Download to read offline
HybridApps
@joonaslehtinen
Founder & CEO
By combining a sophisticated turbocharged
and direct-injected three-cylinder engine
combined with multiple electric motors for
all-wheel drive and a total system output of
362 horsepower and 420 lb-ft. of torque.
Thanks to the car's low curb weight, 0 to 60
mph will come in right around 4.4 seconds

i8
8.6L/100km

2.5L/100km

0L/100km

13ā‚¬/100km

4ā‚¬/100km

1ā‚¬/100km

550km range"

500km range"

450km range"

gas stationsā€Ø
everywhere

gas stationsā€Ø
everywhere

growing chargeā€Ø
station network
What about apps?
Web application layers

Backend
server

Web
server

Communication

JavaScript
Web application layers
Client-side UI
Backend
server

Web
server

Communication

JavaScript
Web application layers

Backend
server

Web
server

Server-side UI

Communication

JavaScript

Automated
Web application layers

JS

Backend
server

Web
server

Communication

required

required

required

Java to
JavaScript

JavaScript

required
Web application layers
Backend
server

Web
server

Communication

Java to
JavaScript

JavaScript

GWT

required

required

required

JS

Client-side UI

required

required

required

required

optional

required
Web application layers

JS

GWT Vaadin

Backend
server

Web
server

Communication

Java to
JavaScript

JavaScript

required

required

optional

optional

optional

required

required

required

required

optional

required

required

required

Server-side UI & Client-side UI

required
Web application layers

JS

GWT Vaadin

Backend
server

Web
server

Communication

Java to
JavaScript

JavaScript

required

required

optional

optional

optional

required

required

1 layer

required

required

required

vs

required

3 layers

-50% dev. time
required
-50% maintenance
vs

optional

required

full control over DOM
and communications
ity

tiv

or

df

ize

tim uc
Op
od
Pr

O

tim
p

fo
ed
iz

e rol
d ont
i C
s

r
e
v
r
e
S

r

tien
Cl
How does the serverside UI work, really?
ā€¢
ā€¢
ā€¢
ā€¢

Initial HTML
CSS (theme)
Images
JavaScript

"

1.2M totalā€Ø
compress

307k
reduced
widgetset

135k
ā€¢ name=ā€Joonasā€
ā€¢ button clicked
"

261 bytesā€Ø
ā€¢ name=ā€Joonasā€
ā€¢ button clicked
"

261 bytes

ā€¢ Add notification
"

267 bytesā€Ø
HybridApps
Client-side
Use for

Server-side
Use for

ā€¢

Ofļ¬‚ine"

ā€¢

Most places ( - 50% cost )"

ā€¢

Low latency interaction"

ā€¢

High security"

ā€¢

Maximum scalability

ā€¢

Utilizing full Java platform

Hybrid
Beneļ¬ts of the both sides, but adds complexity
http://demo.vaadin.com/parking/
Vaadin += GWT
IE6/7"
JS

IE8"
JS

IE9"
JS

IE10"
JS

IE11"
JS

Safari"
JS

Chrome"
JS

FF"
JS

UI.java

Widgets

Java to JS"
compiler

java.util
[super]
DevMode

Optimized
for Google
speed

Static
typing

JSNI

GWT
RPC
compile
time

widgets

complexity
GWT
Compatible
HybridArchitecture
Exampleā€Ø
https://github.com/jojule/hybrid
Web Page Title

Google

http://domain.com

Client-side GWT-RPC

Server-side

First name
Table cell
Table cell
Table cell
Table cell
Table cell

Client-side Vaadin-RPC

Last name
Table cell
Table cell
Table cell
Table cell
Table cell

Table cell

Table cell

Table cell

Table cell

Table cell

Table cell

Table cell

Table cell

Delete

New

Last name

Phone number

rd mountains,
Far far away, behind the wo
ia and
far from the countries Vokal
the blind texts.
Consonantia, there live
okmarksgrove
Separated they live in Bo
mantics, a
right at the coast of the Se
large language ocean.

Table cell

Table cell

Edit

First name

Server-side

Email address

Phone number

Email address

Save

Ofļ¬‚ine

Cancel

n ļ¬‚ows by their
A small river named Dude
the necessary
place and supplies it with
matic country, in
regelialia. It is a paradise
tences ļ¬‚y into
which roasted parts of sen
your mouth.
ng has no
Even the all-powerful Pointi
ts it is an
control about the blind tex
ic life One day
almost unorthograph
d text by the
however a small line of blin
cided to leave
name of Lorem Ipsum de
r. The Big
for the far World of Gramma
to do so,
Oxmox advised her not
nds of bad
because there were thousa
Commas.
AddressbookBackend

Address

Impl
Server-side"
(with Vaadin)

Client-side"
(with GWT-RPC)

AddressbookEditor

Frontend
Backend

Address

AddressbookBackend

Impl
Server-side"
(with Vaadin)

Client-side"
(with GWT-RPC)

AddressbookEditor
create

Connector
Client
Server

AddressbookEditor

place

View
Frontend
Backend

Address

AddressbookBackend

Impl
Server-side"
(with Vaadin)

Client-side"
(with GWT-RPC)

AddressbookEditor
create

Connector
Client
Server

AddressbookEditor

place

View

RPCServlet

Frontend

Service

implements

Backend

Address

AddressbookBackend

Impl
Server-side"
(with Vaadin)

Client-side"
(with GWT-RPC)

AddressbookEditor
create
implements

Proxyā€Ø

Connector

(generated)

Client

ServiceAsync

Server

AddressbookEditor

equal

place

View

RPCServlet

Frontend

Service

implements

Backend

Address

AddressbookBackend

Impl
Estimating
Complexity
Client-side

4 classes
2 interfaces
~ 500 LOC

Server-side

3X

1 class
"

190 LOC
Vaadin
RPC
State
Demo

Widget

Connector
client
server

State
RPC

Component
public interface ButtonRpc extends ServerRpc {
public void click(MouseEventDetails details);
}

private ButtonRpc rpc =
RpcProxy.create(ButtonRpc.class, this);
"
public void onClick(ClickEvent event) {
rpc.click(
new MouseEventDetails(event));
}

client

Demo

private ButtonRpc rpc = new ButtonRpc() {
public void click(
MouseEventDetails details) {
// do stuff
}
};
"
public Button() {
registerRpc(rpc);
}

server
Client-side"
(with Conntector)

Client-side"
(with GWT-RPC)

AddressbookEditor

AddressbookEditor
create

Connector
Client

Client"

Server"

Server

RPC

RPC

create
implements

Proxyā€Ø

Connector

(generated)

State

ServiceAsync
place & "
serve

View

equal

place

View

RPCServlet

Frontend

Service

implements

Backend

Address

AddressbookBackend

Impl
PUSH
Offline
Offline Mode
ā€¢

Client-side UI needed as a basis

ā€¢

Ofļ¬‚ine bootstrap

ā€¢

Local storage database

2X

client-side

Ofļ¬‚ine detection

ā€¢

at least

5X

>
server-side

ā€¢

2-way data synchronization (app speciļ¬c)

ā€¢

Modiļ¬cation logs

ā€¢

Sharding logic
Use Offline
only when really
really needed
Client-side

Hybrid

Server-side

3 layer UI

1-3 layer UI

1 layer UI

Full control"

You choose"

Automated"

ofļ¬‚ine readyā€Ø
architecture

ofļ¬‚ine for chosenā€Ø
functionality

connection toā€Ø
server required
7

Vaadin

.1
Developer
Productivity

Rich
UX
400 add-on
components
Development
cycle
JVM
Source
https://github.com/vaadin/documentmanager
HOWTO Screencast
https://vaadin.com/learn
SUPER

DEVMODE
Demo

Sassā€Ø
Syntactically Awesome Stylesheets
JavaScript
Add-ons
Publish API from Java
getPage().getJavaScript().addFunction("myCallback",	
	 new JavaScriptCallback() {	
	 	 public void call(JSONArray arguments) throws JSONException {	
	 	 	 // Do something with the arguments	
	 	 }	
	 });	
	 	

Use from JavaScript
window.myCallback('foo', 100);
Server-side Java API for Widget
"
public class MyWidget extends AbstractJavaScriptComponent {	
	 public MyWidget() {	
	 	 addFunction("plotClick", new JavaScriptFunction() {	
	 	 	 public void call(JSONArray arguments) throws JSONException {	
	 	 	 	 // Do something with the event	
	 	 	 }	
	 	 });	
	 }	
"
	 public static class MyWidgetState extends JavaScriptComponentState {	
	 	 public List<List<List<Double>>> plotSeriesData = 	
	 	 	 	 new ArrayList<List<List<Double>>>();	
	 }	
public MyWidgetState getState() { return (MyWidgetState) super.getState(); }	
"
"
}
Widget implementation in JavaScript
window.com_example_MyWidget = function() {	
	 var element = $(this.getWidgetElement());	
	 	
// Draw a plot for any server-side (plot data) state change	
	 this.onStateChange = function() {	
	 	 $.plot(element, this.getState().series, {grid: {clickable: true}});	
	 }	
"
// Communicate local events back to server-side component	
	 element.bind('plotclick', function(event, point, item) {	
	 	 if (item) {	
	
var onPlotClick = this.getCallback("plotClick");	
	 	 	 onPlotClick(item.seriesIndex, item.dataIndex);	
	 	 }	
	 });	
}
Server Push
Vaadin 7.2
Gridā€Ø
ā€¢ Client-side data modelā€Ø
ā€¢ Client-side APIsā€Ø
ā€¢ Replaces Table and TreeTable
New theme that leverages SASS
Responsive extension built-inā€Ø

http://vaadin.com/addon/vaadin-responsive ā€Ø
// Vaadin UI
protected void init(VaadinRequest request) {
new Responsive(this);
}
"
"

// CSS
.v-ui[width-range~="0-800px"] {
/* Styles that apply when the UI's width is
between 0 and 800 pixels */
}
.v-ui[width-range~="801px-"] {
/* Styles that apply when the UI's width is
over 800 pixels */
}

http://demo.vaadin.com/responsive/
getting
started
with
vaadin
Eclipse

Download plugin
from Martketplace
IntelliJ IDEA

Built-in support
Netbeans

Download plugin
Netbeans Plugin Portal
Maven

mvn archetype:generate
-DarchetypeGroupId=
com.vaadin
-DarchetypeArtifactId=
vaadin-archetype-application
-DarchetypeVersion=
7.1.7
Download for Free
vaadin.com/book

-93-

1970
-1

01

728 pages
PDF, ePub, HTML
Apache
License
community of

100.000+
developers
?

slideshare.com/
joonaslehtinen

joonas@vaadin.com
vaadin.com/joonas
@joonaslehtinen

More Related Content

What's hot

Apachecon Rails
Apachecon RailsApachecon Rails
Apachecon Rails
Jesse Cai
Ā 
Akka persistence webinar
Akka persistence webinarAkka persistence webinar
Akka persistence webinar
patriknw
Ā 

What's hot (9)

Akka persistence == event sourcing in 30 minutes
Akka persistence == event sourcing in 30 minutesAkka persistence == event sourcing in 30 minutes
Akka persistence == event sourcing in 30 minutes
Ā 
Protocol-Oriented MVVM (extended edition)
Protocol-Oriented MVVM (extended edition)Protocol-Oriented MVVM (extended edition)
Protocol-Oriented MVVM (extended edition)
Ā 
Crossing platforms with JavaScript & React
Crossing platforms with JavaScript & React Crossing platforms with JavaScript & React
Crossing platforms with JavaScript & React
Ā 
Practical Protocols with Associated Types
Practical Protocols with Associated TypesPractical Protocols with Associated Types
Practical Protocols with Associated Types
Ā 
Intro to React
Intro to ReactIntro to React
Intro to React
Ā 
Curing Webpack Cancer
Curing Webpack CancerCuring Webpack Cancer
Curing Webpack Cancer
Ā 
Apachecon Rails
Apachecon RailsApachecon Rails
Apachecon Rails
Ā 
Protocol Oriented MVVM - Auckland iOS Meetup
Protocol Oriented MVVM - Auckland iOS MeetupProtocol Oriented MVVM - Auckland iOS Meetup
Protocol Oriented MVVM - Auckland iOS Meetup
Ā 
Akka persistence webinar
Akka persistence webinarAkka persistence webinar
Akka persistence webinar
Ā 

Similar to Hybrid applications

Client-Server Hybrid Applications with Vaadin
Client-Server Hybrid Applications with VaadinClient-Server Hybrid Applications with Vaadin
Client-Server Hybrid Applications with Vaadin
Artur-vaadin
Ā 
11-DWR-and-JQuery
11-DWR-and-JQuery11-DWR-and-JQuery
11-DWR-and-JQuery
tutorialsruby
Ā 
11-DWR-and-JQuery
11-DWR-and-JQuery11-DWR-and-JQuery
11-DWR-and-JQuery
tutorialsruby
Ā 
Web polyglot programming
Web polyglot programmingWeb polyglot programming
Web polyglot programming
Dmitry Buzdin
Ā 
Walther Ajax4
Walther Ajax4Walther Ajax4
Walther Ajax4
rsnarayanan
Ā 

Similar to Hybrid applications (20)

Server-Client Hybrid UI
Server-Client Hybrid UIServer-Client Hybrid UI
Server-Client Hybrid UI
Ā 
Client-Server Hybrid Applications with Vaadin
Client-Server Hybrid Applications with VaadinClient-Server Hybrid Applications with Vaadin
Client-Server Hybrid Applications with Vaadin
Ā 
Vaadin 7.2
Vaadin 7.2Vaadin 7.2
Vaadin 7.2
Ā 
Hybrid webinar
Hybrid webinarHybrid webinar
Hybrid webinar
Ā 
Vaadin Introduction, 7.3 edition
Vaadin Introduction, 7.3 editionVaadin Introduction, 7.3 edition
Vaadin Introduction, 7.3 edition
Ā 
70562-Dumps
70562-Dumps70562-Dumps
70562-Dumps
Ā 
Direct Web Remoting : DWR
Direct Web Remoting : DWRDirect Web Remoting : DWR
Direct Web Remoting : DWR
Ā 
GWT Web Socket and data serialization
GWT Web Socket and data serializationGWT Web Socket and data serialization
GWT Web Socket and data serialization
Ā 
11-DWR-and-JQuery
11-DWR-and-JQuery11-DWR-and-JQuery
11-DWR-and-JQuery
Ā 
11-DWR-and-JQuery
11-DWR-and-JQuery11-DWR-and-JQuery
11-DWR-and-JQuery
Ā 
Svcc2009 Async Ws
Svcc2009 Async WsSvcc2009 Async Ws
Svcc2009 Async Ws
Ā 
Integrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationIntegrating React.js Into a PHP Application
Integrating React.js Into a PHP Application
Ā 
Mlocjs buzdin
Mlocjs buzdinMlocjs buzdin
Mlocjs buzdin
Ā 
Introduction to Vaadin, GWT.create 2015
Introduction to Vaadin, GWT.create 2015Introduction to Vaadin, GWT.create 2015
Introduction to Vaadin, GWT.create 2015
Ā 
Vaadin & Web Components
Vaadin & Web ComponentsVaadin & Web Components
Vaadin & Web Components
Ā 
The A to Z of developing for the web
The A to Z of developing for the webThe A to Z of developing for the web
The A to Z of developing for the web
Ā 
Web polyglot programming
Web polyglot programmingWeb polyglot programming
Web polyglot programming
Ā 
Vaadin Components
Vaadin ComponentsVaadin Components
Vaadin Components
Ā 
Walther Ajax4
Walther Ajax4Walther Ajax4
Walther Ajax4
Ā 
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R AugeHTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
Ā 

More from Joonas Lehtinen

Notes on architecture
Notes on architectureNotes on architecture
Notes on architecture
Joonas Lehtinen
Ā 
Vaadin roadmap-devoxx-2013
Vaadin roadmap-devoxx-2013Vaadin roadmap-devoxx-2013
Vaadin roadmap-devoxx-2013
Joonas Lehtinen
Ā 
Vaadin7 modern-web-apps-in-java
Vaadin7 modern-web-apps-in-javaVaadin7 modern-web-apps-in-java
Vaadin7 modern-web-apps-in-java
Joonas Lehtinen
Ā 

More from Joonas Lehtinen (20)

Web Components for Java Developers
Web Components for Java DevelopersWeb Components for Java Developers
Web Components for Java Developers
Ā 
Vaadin Components @ Angular U
Vaadin Components @ Angular UVaadin Components @ Angular U
Vaadin Components @ Angular U
Ā 
Vaadin intro
Vaadin introVaadin intro
Vaadin intro
Ā 
Vaadin intro at GWT.create conference
Vaadin intro at GWT.create conferenceVaadin intro at GWT.create conference
Vaadin intro at GWT.create conference
Ā 
Notes on architecture
Notes on architectureNotes on architecture
Notes on architecture
Ā 
Vaadin roadmap-devoxx-2013
Vaadin roadmap-devoxx-2013Vaadin roadmap-devoxx-2013
Vaadin roadmap-devoxx-2013
Ā 
Beoynd Vaadin 7
Beoynd Vaadin 7Beoynd Vaadin 7
Beoynd Vaadin 7
Ā 
Vaadin 7
Vaadin 7Vaadin 7
Vaadin 7
Ā 
Vaadin7
Vaadin7Vaadin7
Vaadin7
Ā 
Hackathon - Building vaadin add on components
Hackathon - Building vaadin add on componentsHackathon - Building vaadin add on components
Hackathon - Building vaadin add on components
Ā 
Vaadin7
Vaadin7Vaadin7
Vaadin7
Ā 
Vaadin today and tomorrow
Vaadin today and tomorrowVaadin today and tomorrow
Vaadin today and tomorrow
Ā 
Migration from vaadin 6 to vaadin 7 devoxx france 2013
Migration from vaadin 6 to vaadin 7   devoxx france 2013Migration from vaadin 6 to vaadin 7   devoxx france 2013
Migration from vaadin 6 to vaadin 7 devoxx france 2013
Ā 
Vaadin7 modern-web-apps-in-java
Vaadin7 modern-web-apps-in-javaVaadin7 modern-web-apps-in-java
Vaadin7 modern-web-apps-in-java
Ā 
Vaadin 7 Today and Tomorrow
Vaadin 7 Today and TomorrowVaadin 7 Today and Tomorrow
Vaadin 7 Today and Tomorrow
Ā 
Vaadin 7
Vaadin 7Vaadin 7
Vaadin 7
Ā 
Desingning reusable web components
Desingning reusable web componentsDesingning reusable web components
Desingning reusable web components
Ā 
Lecture: Vaadin Overview
Lecture: Vaadin OverviewLecture: Vaadin Overview
Lecture: Vaadin Overview
Ā 
Vaadin 7
Vaadin 7Vaadin 7
Vaadin 7
Ā 
Vaadin 7 what next
Vaadin 7   what nextVaadin 7   what next
Vaadin 7 what next
Ā 

Recently uploaded

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
Ā 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
Christopher Logan Kennedy
Ā 

Recently uploaded (20)

Simplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxSimplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptx
Ā 
Modernizing Legacy Systems Using Ballerina
Modernizing Legacy Systems Using BallerinaModernizing Legacy Systems Using Ballerina
Modernizing Legacy Systems Using Ballerina
Ā 
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
Ā 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
Ā 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
Ā 
Navigating Identity and Access Management in the Modern Enterprise
Navigating Identity and Access Management in the Modern EnterpriseNavigating Identity and Access Management in the Modern Enterprise
Navigating Identity and Access Management in the Modern Enterprise
Ā 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
Ā 
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Ā 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate Guide
Ā 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
Ā 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Ā 
Choreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringChoreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software Engineering
Ā 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Ā 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Ā 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
Ā 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
Ā 
API Governance and Monetization - The evolution of API governance
API Governance and Monetization -  The evolution of API governanceAPI Governance and Monetization -  The evolution of API governance
API Governance and Monetization - The evolution of API governance
Ā 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
Ā 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
Ā 
Decarbonising Commercial Real Estate: The Role of Operational Performance
Decarbonising Commercial Real Estate: The Role of Operational PerformanceDecarbonising Commercial Real Estate: The Role of Operational Performance
Decarbonising Commercial Real Estate: The Role of Operational Performance
Ā 

Hybrid applications