Practical ERSync David Aspinall Global Village Consulting Inc. 1 - - PowerPoint PPT Presentation

practical ersync
SMART_READER_LITE
LIVE PREVIEW

Practical ERSync David Aspinall Global Village Consulting Inc. 1 - - PowerPoint PPT Presentation

MONTREAL JUNE 30, JULY 1ST AND 2ND 2012 Practical ERSync David Aspinall Global Village Consulting Inc. 1 Outline Sync Overview 1 Integrating with WebObjects 2 Integrating with iOS 3 Development Plan 4 2 Introduction Who am I


slide-1
SLIDE 1

MONTREAL JUNE 30, JULY 1ST AND 2ND 2012

Practical ERSync

1

David Aspinall Global Village Consulting Inc.

slide-2
SLIDE 2

Outline

1 2 3 4 Sync Overview Integrating with WebObjects Integrating with iOS Development Plan

2

slide-3
SLIDE 3

Introduction

  • Who am I
  • David Aspinall
  • Developer / Consultant for Global

Village Consulting Inc.

3

slide-4
SLIDE 4

Why ERSync?

  • Why not REST/SOAP/...
  • Framework to simplify data distribution to mobile apps
  • Contribute to the WOCommunity
  • Leverage for my clients and projects

4

slide-5
SLIDE 5

Sync Objective

The goal is to make 2 disconnected sets of data match .. as quickly as possible .. in a way the user expects

5

Objective-Sync

slide-6
SLIDE 6

What is Sync

6

slide-7
SLIDE 7

What is that cloud?

Dropbox iCloud Miracles

7

slide-8
SLIDE 8

We are Wonder-ful

Design Objectives

  • Leverage our WO experience, products and services.
  • Minimally impact our existing code base.
  • No server database changes in existing business system.
  • No sprinkling of interfaces or special logic in current system
  • Simple client protocol and supporting library

8

slide-9
SLIDE 9

What is ERSync

9

?

WO App ERRest ERSync

slide-10
SLIDE 10

Integrating with WebObjects

  • Built on ERRest (routes, transport ...)
  • EOObjectStoreCoordinator.ObjectsChangedInStoreNotification
  • No model changes required in existing system
  • ERSync database can be different schema, host or database
  • All relevant data changes must notify the sync engine
  • framework is linked in, turned on
  • distributed change notification (ERChangeNotificationJMS)

10

slide-11
SLIDE 11

The Easy Part

public class Application extends ERXApplication { public static void main(String[] argv) { ERXApplication.main(argv, Application.class); } public Application() { ERXApplication.log.info("Welcome to " + name() + " !"); /* ** put your initialization code in here ** */ ERXDatabaseContextMulticastingDelegate.addDefaultDelegate(new ERXEntityDependencyOrderingDelegate());

ERXSyncHandler syncHandler = new ERXSyncHandler(); syncHandler.setSyncAuthenticator(new SyncAuthenticationProvider()); ERXSyncHandler.register(syncHandler);

} }

11

slide-12
SLIDE 12

What did that do?

  • ERXSyncHandler extends ERXRouteRequestHandler
  • creates REST routes
  • adds change notification observer
  • Sync Authenticator
  • this is the gateway class between ERSync and your Application

12

slide-13
SLIDE 13

Sync Authenticator

  • authenticates a user by username and password
  • does NOT implement authentication, it should call your logic
  • provides list of Sync’able Entity Names
  • provide all EOKeyGlobalID’s for a given user
  • basically CRUD processor

13

slide-14
SLIDE 14

Sync Authenticator

public interface ERXSyncAuthenticator { public ERXSyncUser userForCredentials(String nme,String pwd, EOEditingContext ec); public NSArray<String> syncEntityNames(); public NSArray<EOKeyGlobalID> syncObjectsForEntityUser(String entityName, ERXSyncUser usr, EOEditingContext ec); public EOEnterpriseObject syncInsertObject(EOEditingContext editingContext, EOEntity eoEntity, NSDictionary dict, ERXSyncUser user); public void syncUpdateObject(EOEnterpriseObject eo, NSDictionary dict, ERXSyncUser user); public void syncDeleteObject(EOEnterpriseObject eo, ERXSyncUser user); }

14

slide-15
SLIDE 15

ERSync tracking

15

ERSyncEntity

token status uuid updatedDate

Token

  • Must be able to reconstruct the EO
  • Cannot be a FK because we need to track deletes
  • Currently using
  • EntityName:pk[-pk*]
  • Note:1000001
  • Planning to change it to URI
  • ersync://EntityName/pk[/pk*]
  • ersync://Note/100001
  • ersync://Compound/10001/4432
slide-16
SLIDE 16

ERSync tracking

16

ERSyncEntity

token status uuid updatedDate

Status V - Virgin - never by sync’d I - Inserted U - Updated D - Deleted

slide-17
SLIDE 17

ERSync tracking

17

ERSyncEntity

token status uuid updatedDate

UUID

  • The Database agnostic, universally unique id
  • Clients will ALWAYS provide a UUID
  • usually the UUID assigned by the server
  • where the client inserts, it assigns the

UUID and leaves the token blank

  • Removes primary key distribution and

collision problems

slide-18
SLIDE 18

Change Notification Process

18

ERSyncChangeset

uuid updatedDate

ERSyncChangeValue

attibuteName valueType

ERSyncChangeBoolean

booleanValue

ERSyncChangeInteger

intValue

ERSyncChangeString

booleanValue

ERSyncEntity

token status uuid updatedDate

ERSyncChangeToOne

toOneValue

ERSyncChangeToMany M-M ERSyncChange .. Float .. Double .. BLOB .. ERSyncAuthRef

token uuid name

M-M

slide-19
SLIDE 19

ERSyncPrincipal

deviceUUID principalUUID lastSyncDate

ERSyncAuthRef

token uuid name

ERSync API Security

19

ERSyncClientDevice

disable name uuid

ERSyncClientDeveloper

disable name uuid

ERSyncClientApplication

disable name uuid

slide-20
SLIDE 20

Integrating with iOS

  • Very similar to the WO approach
  • Built on GVC Open frameworks

20

slide-21
SLIDE 21

The Easy Part

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

  • [super application:application didFinishLaunchingWithOptions:launchOptions];

[self setEngine:[[SyncEngine alloc] initWithEditingContext:[self managedObjectContext]]]; [[self engine] addSupportedEntity:[Note entityName]]; [[self engine] addSupportedEntity:[Category entityName]]; [self setPrincipal:[SyncPrincipal

  • pseudoSingletonInContext:[self managedObjectContext]];

return YES; }

21

slide-22
SLIDE 22

What did that do?

  • SyncEngine is the client version of ERXSyncHandler
  • adds change notification observer for main context
  • SyncPrincipal
  • Core Data record to store configuration information.

22

slide-23
SLIDE 23

iOS Model

23

SyncChangeset

uuid updatedDate

SyncChangeValue

attibuteName valueType value

ERSyncEntity

token name status uuid updatedDate

SyncPrincipal

username password site principaluuid lastSync toOneValue toManyValue

M-M

slide-24
SLIDE 24

Client Process

  • 1. Registration
  • 2. Initial / Full / Slow Sync
  • 3. Delta / Fast Sync

24

slide-25
SLIDE 25

Client Process - Registration

  • Links the client application and device to a

user on the server

  • must provide server assigned
  • application UUID
  • device Type UUID
  • provide client assigned and locally stored
  • device UUID
  • user credentials

25

<registration> <appid>

5AC343C6-2C35-4BB0-9A00-CE2938A12260

</appid> <deviceType>

743E2D47-DDA4-4827-A164-0C61547CD4D5

</deviceType> <deviceUUID>

D9781163-2A97-4E90-B978-DE2B9F86A9D5

</deviceUUID> <user>david</user> <password>tester</password> </registration>

slide-26
SLIDE 26

Client Process - Registration

  • server response provides
  • principal UUID
  • last Sync date (only if previously sync’d)

26

<sync> <principalUUID>

dce87db1-0e87-44b6-9680-19dcd672eadb

</principalUUID> <lastSync type = "datetime"> 2012-06-30T10:25:10Z </lastSync> </sync>

slide-27
SLIDE 27

Client Process - Sync

  • Client initiates communication
  • sends principal UUID and last Sync
  • data in the Insert / Update / Delete
  • rder

27

<sync> <principalUUID>

dce87db1-0e87-44b6-9680-19dcd672eadb

</principalUUID> <lastSync>2012-06-30T09:39:11Z</lastSync> <data> <Note id="EA3E9977-8B58-40FE-85CF-4E4027723DF8" status="update"> <subject>My new subject</subject> <category> <Category id="Category:1000000" /> </category> ...

slide-28
SLIDE 28

Client Process - Sync

  • Server response
  • echo principal UUID
  • provides new last Sync date
  • data in the Insert / Update / Delete
  • rder

28

<sync> <principalUUID>

dce87db1-0e87-44b6-9680-19dcd672eadb

</principalUUID> <lastSync>2012-06-30T09:55:11Z</lastSync> <data> <Reminder id="EA3E9977-8B58-40FE-85CF-4E4027723DF8" status="update"> <name>Get Siri off my back</name> <type> <ReminderType id="ReminderType:active"/> </type> ...

slide-29
SLIDE 29

We are Wonder-ful

Design Objectives

Leverage our WO experience, products and services.

Minimally impact our existing code base.

No server database changes in existing business system.

No sprinkling of interfaces or special logic in current system

Simple client protocol and supporting library

29

slide-30
SLIDE 30

Development Plan - WO

  • Add support for Additional Change

Value Types

  • float, double, char .. scalar types
  • BLOB, CLOB, LOB .. SLOBs

30

slide-31
SLIDE 31

Development Plan - WO

  • Track the SyncEntity status per Principal
  • a principal represents a client/device combo
  • entity status can be different on each device

31

  • Add support for Additional Change

Value Types

slide-32
SLIDE 32

Development Plan - WO

  • Purge Changesets once all Principals have sync’d
  • if all the registered client/devices have the change then it is not

needed

  • new registrations will be ‘Virgin’ and require the current record
  • anyway. (ERSync is not a History engine)

32

  • Add support for Additional Change

Value Types

  • Track the Entity status per Principal
slide-33
SLIDE 33

Development Plan - WO

  • Make SyncEntity a composite of several EOEntity types
  • Related but De-normalized data
  • virtual entity for non-relational data (images/thumbnails)

33

  • Add support for Additional Change

Value Types

  • Track the Entity status per Principal
  • Purge Changesets once all Principals have sync’d
slide-34
SLIDE 34

Development Plan - WO

  • Allow the client to sync a subset of data
  • date range (example bank transactions in 30 day window)
  • data group (example Toronto address book as a window into a

larger address book)

34

  • Add support for Additional Change

Value Types

  • Track the Entity status per Principal
  • Purge Changesets once all Principals have sync’d
  • Make SyncEntity a composite of several EOEntity types
slide-35
SLIDE 35

Development Plan - iOS

  • Clean up the iOS ERSync framework
  • ARC and Block compatible
  • ERBranding
  • Sync related UI components?

35

slide-36
SLIDE 36

Development Plan - iOS

  • ERSyncEngine
  • Does not need to process anything until registration
  • Manage operations automatically
  • detect errors/resets from server and perform full sync cycle

36

  • Clean up the iOS ERSync framework
slide-37
SLIDE 37

Development Plan - iOS

  • Multiple CoreData model migration
  • 1. merged models cannot be migrated automatically
  • 2. Individual Stores cannot be migrated automatically

37

  • Clean up the iOS ERSync framework
  • ERSyncEngine
slide-38
SLIDE 38

Q&A

MONTREAL JUNE 30, JULY 1ST AND 2ND 2012

38

slide-39
SLIDE 39

Web Resources

  • Source is currently available at:

https://github.com/davidAtGVC/RemoteSync

  • The iOS projects have submodule references for the GVC Open kits:

https://github.com/davidAtGVC/GVCFoundation https://github.com/davidAtGVC/GVCUIKit https://github.com/davidAtGVC/GVCCoreData

39

slide-40
SLIDE 40

40

Start Session Negotiate Mode Should Push Push Should Pull Pull Stop

No - Login Yes No Yes Yes No

Source: Apple Sync Services Programming Guide

The sync process overview

1 2 3

slide-41
SLIDE 41

Why is this important

  • Data != Files
  • Pass the TTC test

41