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