SlideShare a Scribd company logo
EEIncrementalStore
Enterprise Data Synchronization framework
Approccio classico
❖ Application centric: i servizi sono pensati per
una particolare applicazione e per il flusso di
navigazione su cui essa è costruita
❖ Service centric: al centro i servizi, l’
applicazione si adatta a ciò che viene messo
a disposizione
❖ Hybrid approach: la solita via di mezzo !
Approccio classico: lettura
❖ Dati richiesti al server
➢ le strutture ricevute sono memorizzate:
■ in memoria
■ su file-system
■ su un qualche DB locale
➢ dobbiamo pensare a come implementare il caching
■ politiche di caching
Approccio classico: scrittura
❖ Dati inviati al server
➢ uno o più servizi
➢ uno o più formati di trasferimento
Approccio classico: criticità
❖ Ogni volta si inizia da zero
Offline in un mondo connesso?
❖ Perché oggi che tutti parlano di banda larga
e connettività ovunque noi proponiamo un
framework che permette di lavorare offline ?
Cosa è disponibile ?
❖ Open source
➢ Helios.io
➢ OpenMobster

❖ Tra i più importanti a pagamento
➢ SAP Mobile 3.x
➢ Oracle Database Mobile Server 11g
➢ IBM WorkLight 5.x (*)

❖ As a service ???
NSIncrementalStore: poor’s iCloud
❖ Persistence store con i soli dati necessari
per l’app. Ideale per mobile app che usano
Web Services.
❖ Argomento complesso che Apple documenta
in modo piuttosto breve
❖ Dal progetto open source
AFIncrementalStore è stato possibile
comprenderne meglio il funzionamento.
EEIncrementalStore: architettura

@Entity

NSManagedObject

Cocoa Application

CoreData Model

JEE6 Application
EEIncrementalStore: oggetti
@Entity
@Remote
@NamedQueries({
@NamedQuery(name = "findAllArgomentoDTOs", query = "select distinct(e) from ArgomentoDTO e left join fetch e.
attivita"),
@NamedQuery(name = "findAllModifiedArgomentoDTOs", query = "select distinct(e) from ArgomentoDTO e left join
fetch e.attivita where e.modified > :modified"),
@NamedQuery(name = "deleteArgomentoDTOByPk", query = "delete from ArgomentoDTO e where e.argomentodto_id
= :key"),
@NamedQuery(name = "findAllArgomentoDTOsByKeys", query = "select e from ArgomentoDTO e where e.
argomentodto_id in :keys")
})
@JsonIgnoreProperties({
"_persistence_fetchGroup"
})
public class ArgomentoDTO
extends GenericMobileEntity
{
@Id
private String argomentodto_id;
private String descrizione;
@OneToMany
@JsonManagedReference
private List<AttivitaDTO> attivita = new ArrayList<AttivitaDTO>();
}

@class AttivitaDTO;
@interface ArgomentoDTO : NSManagedObject
@property (nonatomic, retain) NSString * argomentodto_id;
@property (nonatomic, retain) NSString * descrizione;
@property (nonatomic, retain) NSOrderedSet *attivita;
@end
@interface ArgomentoDTO (CoreDataGeneratedAccessors)
- (void)insertObject:(AttivitaDTO *)value inAttivitaAtIndex:(NSUInteger)idx;
- (void)removeObjectFromAttivitaAtIndex:(NSUInteger)idx;
- (void)insertAttivita:(NSArray *)value atIndexes:(NSIndexSet *)indexes;
- (void)removeAttivitaAtIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectInAttivitaAtIndex:(NSUInteger)idx withObject:(AttivitaDTO *)value;
- (void)replaceAttivitaAtIndexes:(NSIndexSet *)indexes withAttivita:(NSArray *)values;
- (void)addAttivitaObject:(AttivitaDTO *)value;
- (void)removeAttivitaObject:(AttivitaDTO *)value;
- (void)addAttivita:(NSOrderedSet *)values;
- (void)removeAttivita:(NSOrderedSet *)values;
@end
EEIncrementalStore: client side
Server
REST Web Services
Save

Client

GET, POST, PUT, DELETE

EEIncrementalStore
Fetch

In Memory
Persistence Store
(data model)

On Disk
Persistence Store
(data model)

DB
SQlite
EEIncrementalStore: server side
JEE6 Container

RESTful layer JAX-RS

JPA

Enterprise
Data
Mobile Objects
Cache

Online-Sync Plugin

Offline-Sync Flows
EEIncrementalStore: plugins
❖
❖

❖

Alcuni “Mobile Objects” hanno bisogno di logica applicativa
Per non doverla spostare sul client esiste la possibilità di usare gli “online
plugin” che permettono l’esecuzione di logica server-side e l’eventuale
modifica dei dati da mandare ai client
Sono solo CDI Observer, del tutto disaccoppiati dalla logica di
EEIncrementalStore:
@Override
public void myBusinessLogicMethod(@Observes @ReadSynch EntityInfo entityInfo) {
if(entityInfo.getEntityType().getJavaType().equals(ChecklistDTO.class)) {
Date modifiedSince = null;
…
…
}
EEIncrementalStore: caratteristiche
❖ L’applicazione può lavorare offline
❖ Lo sviluppatore del client lavora solo con
CoreData, API standard, e non si preoccupa
di dover implementare lo strato di servizi
❖ La vera logica applicativa rimane sul server
in forma di “plugin” di EEIncrementalStore
EEIncrementalStore: esempio
❖ Facciamo vedere un video per non
arrischiarci in demo live ?
❖ Mostriamo checklist o forse meglio l’esempio
classico con Employee, Departments, etc ??
EEIncrementalStore: sviluppi futuri
❖ Push con SSE
❖ Persistenza dei dati prima della sync
❖ Gestione automatica dei conflitti ??

More Related Content

PDF
Javascript - 4 | WebMaster & WebDesigner
PDF
Intel ndk - a few Benchmarks
PDF
Clean android code
PDF
Apertura "Mobile & Embedded" - 13 febbraio 2014
PDF
Android chat in the cloud
PPT
#Html2Native
PDF
Programming objects with android
PDF
IoT, serve?
Javascript - 4 | WebMaster & WebDesigner
Intel ndk - a few Benchmarks
Clean android code
Apertura "Mobile & Embedded" - 13 febbraio 2014
Android chat in the cloud
#Html2Native
Programming objects with android
IoT, serve?

Similar to EE Incremental Store (20)

PDF
MongoDb and Scala SpringFramework Meeting
PDF
MongoDB Scala Roma SpringFramework Meeting2009
PDF
May 2010 - Hibernate search
PDF
Hibernatesearch
PDF
SaaS con Symfony2
PDF
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
PDF
Programmazione web libera dai framework
PDF
MongoDB SpringFramework Meeting september 2009
PDF
Simple Cloud API: accesso semplificato al cloud computing
PDF
Abusing HTML 5 Client-side Storage
PDF
#dd12 Applicazioni a tre voci (Android e Domino)
ODP
Rich Ajax Web Interfaces in Jquery
PDF
Design Patterns - Enterprise Patterns (part 2)
PDF
How I did it (in .NET): idiomatic Domain Driven Design
PDF
MongoDB User Group Padova - Overviews iniziale su MongoDB
PDF
Elasticsearch a quick introduction
PDF
WEBdeBS NFC Presentation
KEY
Whymca nfc presentation
PDF
Whymca nfc presentation
PDF
Android - ishan fernando - android nfc presentation
MongoDb and Scala SpringFramework Meeting
MongoDB Scala Roma SpringFramework Meeting2009
May 2010 - Hibernate search
Hibernatesearch
SaaS con Symfony2
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
Programmazione web libera dai framework
MongoDB SpringFramework Meeting september 2009
Simple Cloud API: accesso semplificato al cloud computing
Abusing HTML 5 Client-side Storage
#dd12 Applicazioni a tre voci (Android e Domino)
Rich Ajax Web Interfaces in Jquery
Design Patterns - Enterprise Patterns (part 2)
How I did it (in .NET): idiomatic Domain Driven Design
MongoDB User Group Padova - Overviews iniziale su MongoDB
Elasticsearch a quick introduction
WEBdeBS NFC Presentation
Whymca nfc presentation
Whymca nfc presentation
Android - ishan fernando - android nfc presentation
Ad

More from firenze-gtug (20)

PDF
Html5 apps - GWT oriented
PDF
Android ndk - ottimizzazione su dispositivi Intel
PDF
Gwt kickoff - Alberto Mancini & Francesca Tosi
PDF
Youtube broadcast live - Massimiliano D'Ambrosio
PDF
Intro BeagleBone Black - Massimiliano D'Ambrosio
PDF
Arduino - Massimiliano D'Ambrosio
PDF
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
PDF
RFID: What & Why - Stefano Coluccini
PDF
GWT - AppDays - (25 aprile 2014, pordenone)
PDF
Presentazione Google App Engine
PDF
Maven from dummies
PPTX
Apps fuel oct2012
PDF
Dev fest android application case study
PDF
google drive and the google drive sdk
PDF
You tube api overview
PDF
AdWordsScripts v1
PDF
Gwt development with errai and forge
PDF
Google tv gdg_devfest_firenze2012
PDF
Dev fest2012 opening
PDF
Unconventional webapps with gwt:elemental & html5
Html5 apps - GWT oriented
Android ndk - ottimizzazione su dispositivi Intel
Gwt kickoff - Alberto Mancini & Francesca Tosi
Youtube broadcast live - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'Ambrosio
Arduino - Massimiliano D'Ambrosio
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
RFID: What & Why - Stefano Coluccini
GWT - AppDays - (25 aprile 2014, pordenone)
Presentazione Google App Engine
Maven from dummies
Apps fuel oct2012
Dev fest android application case study
google drive and the google drive sdk
You tube api overview
AdWordsScripts v1
Gwt development with errai and forge
Google tv gdg_devfest_firenze2012
Dev fest2012 opening
Unconventional webapps with gwt:elemental & html5
Ad

EE Incremental Store

  • 2. Approccio classico ❖ Application centric: i servizi sono pensati per una particolare applicazione e per il flusso di navigazione su cui essa è costruita ❖ Service centric: al centro i servizi, l’ applicazione si adatta a ciò che viene messo a disposizione ❖ Hybrid approach: la solita via di mezzo !
  • 3. Approccio classico: lettura ❖ Dati richiesti al server ➢ le strutture ricevute sono memorizzate: ■ in memoria ■ su file-system ■ su un qualche DB locale ➢ dobbiamo pensare a come implementare il caching ■ politiche di caching
  • 4. Approccio classico: scrittura ❖ Dati inviati al server ➢ uno o più servizi ➢ uno o più formati di trasferimento
  • 5. Approccio classico: criticità ❖ Ogni volta si inizia da zero
  • 6. Offline in un mondo connesso? ❖ Perché oggi che tutti parlano di banda larga e connettività ovunque noi proponiamo un framework che permette di lavorare offline ?
  • 7. Cosa è disponibile ? ❖ Open source ➢ Helios.io ➢ OpenMobster ❖ Tra i più importanti a pagamento ➢ SAP Mobile 3.x ➢ Oracle Database Mobile Server 11g ➢ IBM WorkLight 5.x (*) ❖ As a service ???
  • 8. NSIncrementalStore: poor’s iCloud ❖ Persistence store con i soli dati necessari per l’app. Ideale per mobile app che usano Web Services. ❖ Argomento complesso che Apple documenta in modo piuttosto breve ❖ Dal progetto open source AFIncrementalStore è stato possibile comprenderne meglio il funzionamento.
  • 10. EEIncrementalStore: oggetti @Entity @Remote @NamedQueries({ @NamedQuery(name = "findAllArgomentoDTOs", query = "select distinct(e) from ArgomentoDTO e left join fetch e. attivita"), @NamedQuery(name = "findAllModifiedArgomentoDTOs", query = "select distinct(e) from ArgomentoDTO e left join fetch e.attivita where e.modified > :modified"), @NamedQuery(name = "deleteArgomentoDTOByPk", query = "delete from ArgomentoDTO e where e.argomentodto_id = :key"), @NamedQuery(name = "findAllArgomentoDTOsByKeys", query = "select e from ArgomentoDTO e where e. argomentodto_id in :keys") }) @JsonIgnoreProperties({ "_persistence_fetchGroup" }) public class ArgomentoDTO extends GenericMobileEntity { @Id private String argomentodto_id; private String descrizione; @OneToMany @JsonManagedReference private List<AttivitaDTO> attivita = new ArrayList<AttivitaDTO>(); } @class AttivitaDTO; @interface ArgomentoDTO : NSManagedObject @property (nonatomic, retain) NSString * argomentodto_id; @property (nonatomic, retain) NSString * descrizione; @property (nonatomic, retain) NSOrderedSet *attivita; @end @interface ArgomentoDTO (CoreDataGeneratedAccessors) - (void)insertObject:(AttivitaDTO *)value inAttivitaAtIndex:(NSUInteger)idx; - (void)removeObjectFromAttivitaAtIndex:(NSUInteger)idx; - (void)insertAttivita:(NSArray *)value atIndexes:(NSIndexSet *)indexes; - (void)removeAttivitaAtIndexes:(NSIndexSet *)indexes; - (void)replaceObjectInAttivitaAtIndex:(NSUInteger)idx withObject:(AttivitaDTO *)value; - (void)replaceAttivitaAtIndexes:(NSIndexSet *)indexes withAttivita:(NSArray *)values; - (void)addAttivitaObject:(AttivitaDTO *)value; - (void)removeAttivitaObject:(AttivitaDTO *)value; - (void)addAttivita:(NSOrderedSet *)values; - (void)removeAttivita:(NSOrderedSet *)values; @end
  • 11. EEIncrementalStore: client side Server REST Web Services Save Client GET, POST, PUT, DELETE EEIncrementalStore Fetch In Memory Persistence Store (data model) On Disk Persistence Store (data model) DB SQlite
  • 12. EEIncrementalStore: server side JEE6 Container RESTful layer JAX-RS JPA Enterprise Data Mobile Objects Cache Online-Sync Plugin Offline-Sync Flows
  • 13. EEIncrementalStore: plugins ❖ ❖ ❖ Alcuni “Mobile Objects” hanno bisogno di logica applicativa Per non doverla spostare sul client esiste la possibilità di usare gli “online plugin” che permettono l’esecuzione di logica server-side e l’eventuale modifica dei dati da mandare ai client Sono solo CDI Observer, del tutto disaccoppiati dalla logica di EEIncrementalStore: @Override public void myBusinessLogicMethod(@Observes @ReadSynch EntityInfo entityInfo) { if(entityInfo.getEntityType().getJavaType().equals(ChecklistDTO.class)) { Date modifiedSince = null; … … }
  • 14. EEIncrementalStore: caratteristiche ❖ L’applicazione può lavorare offline ❖ Lo sviluppatore del client lavora solo con CoreData, API standard, e non si preoccupa di dover implementare lo strato di servizi ❖ La vera logica applicativa rimane sul server in forma di “plugin” di EEIncrementalStore
  • 15. EEIncrementalStore: esempio ❖ Facciamo vedere un video per non arrischiarci in demo live ? ❖ Mostriamo checklist o forse meglio l’esempio classico con Employee, Departments, etc ??
  • 16. EEIncrementalStore: sviluppi futuri ❖ Push con SSE ❖ Persistenza dei dati prima della sync ❖ Gestione automatica dei conflitti ??