EE Incremental Store

16
EEIncrementalStore Enterprise Data Synchronization framework

description

EE Incremental Store Luca Masini - Mobile & Embedded - GDG Firenze

Transcript of EE Incremental Store

Page 1: EE Incremental Store

EEIncrementalStoreEnterprise Data Synchronization framework

Page 2: EE Incremental Store

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 !

Page 3: EE Incremental Store

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

Page 4: EE Incremental Store

Approccio classico: scrittura

❖ Dati inviati al server➢ uno o più servizi➢ uno o più formati di trasferimento

Page 5: EE Incremental Store

Approccio classico: criticità

❖ Ogni volta si inizia da zero

Page 6: EE Incremental Store

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 ?

Page 7: EE Incremental Store

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 ???

Page 8: EE Incremental Store

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.

Page 9: EE Incremental Store

EEIncrementalStore: architettura

NSManagedObject @Entity

CoreData ModelCocoa Application JEE6 Application

Page 10: EE Incremental Store

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

Page 11: EE Incremental Store

EEIncrementalStore: client side

In Memory Persistence Store

(data model)

Client

Server

EEIncrementalStoreOn Disk

Persistence Store (data model)

DB SQlite

REST Web Services

Fetch

Save GET, POST, PUT, DELETE

Page 12: EE Incremental Store

Enterprise Data

JPA

RESTful layer JAX-RS

EEIncrementalStore: server sideJEE6 Container

Mobile ObjectsCache

Online-Sync Plugin

Offline-Sync Flows

Page 13: EE Incremental Store

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:

@Overridepublic void myBusinessLogicMethod(@Observes @ReadSynch EntityInfo entityInfo) { if(entityInfo.getEntityType().getJavaType().equals(ChecklistDTO.class)) { Date modifiedSince = null;……}

Page 14: EE Incremental Store

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

Page 15: EE Incremental Store

EEIncrementalStore: esempio

❖ Facciamo vedere un video per non arrischiarci in demo live ?

❖ Mostriamo checklist o forse meglio l’esempio classico con Employee, Departments, etc ??

Page 16: EE Incremental Store

EEIncrementalStore: sviluppi futuri

❖ Push con SSE❖ Persistenza dei dati prima della sync❖ Gestione automatica dei conflitti ??