EE Incremental Store

Post on 07-Nov-2014

864 views 0 download

Tags:

description

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

Transcript of EE Incremental Store

EEIncrementalStoreEnterprise 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

NSManagedObject @Entity

CoreData ModelCocoa Application 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

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

Enterprise Data

JPA

RESTful layer JAX-RS

EEIncrementalStore: server sideJEE6 Container

Mobile ObjectsCache

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:

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