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