EE Incremental Store
Post on 07-Nov-2014
861 Views
Preview:
DESCRIPTION
Transcript
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 ??
top related