EE Incremental Store

955 views
865 views

Published on

EE Incremental Store

Luca Masini - Mobile & Embedded - GDG Firenze

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
955
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

EE Incremental Store

  1. 1. EEIncrementalStore Enterprise Data Synchronization framework
  2. 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. 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. 4. Approccio classico: scrittura ❖ Dati inviati al server ➢ uno o più servizi ➢ uno o più formati di trasferimento
  5. 5. Approccio classico: criticità ❖ Ogni volta si inizia da zero
  6. 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. 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. 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.
  9. 9. EEIncrementalStore: architettura @Entity NSManagedObject Cocoa Application CoreData Model JEE6 Application
  10. 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. 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. 12. EEIncrementalStore: server side JEE6 Container RESTful layer JAX-RS JPA Enterprise Data Mobile Objects Cache Online-Sync Plugin Offline-Sync Flows
  13. 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. 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. 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. 16. EEIncrementalStore: sviluppi futuri ❖ Push con SSE ❖ Persistenza dei dati prima della sync ❖ Gestione automatica dei conflitti ??

×