WOdka

95
WOdka Ken ISHIMOTO (K’s Room Japan) David HOLT (CSCW System Corporation)

Transcript of WOdka

Page 1: WOdka

WOdkaKen ISHIMOTO (K’s Room Japan)

David HOLT (CSCW System Corporation)

Page 2: WOdka

Dashboard

jQuery

Authentication

Central personStamped enterprise object

logical delete

Domains Avatar

Roles & Permissions

NotificationCenter

Woopra

D3W

new Rule system

custom D2W Component

Navigation Handler

Rule Validation

Navigation Query

Button Delegate

Button Confirm Delegate

CSV Export

CSV Import

SnoWOman

Pick-listFast User switching Modern look CSS3

Multi-language Support

GumbyjQueryMobile D2W

REST

Ant

Page 3: WOdka

• WOdka is a Framework that originally was developed in Japan

• WebObjects Development by K’s Room & A10

What is WOdka

Page 4: WOdka

Who works with WOdkaKen Ishimoto

Paul Yu

David Holt

Paul Halliday

Masahiko Tani

Hiroyuki Fukui

Amedeo Mantica

Page 5: WOdka

What Frameworks are included?• AuditTrail (improved version)

• JQueryMobileD2W

• ModernistD2W (improved Modernlook)

• D3WCore

• D3WExcelSupport (ExcelLook improved version)

• Notification Center

• Database Driver

• JapserReport (improved version)

• SnoWOman

• SKIN’s for Look

• Barcode

• CSV Import

• WOdka + WOdkaBaseModel

• JGroupsSynchronizer (improved)

• Emoji + KeyValueDataStorage

• more ...

Page 6: WOdka

WOdka Structure & History

WebObjects

WOnder

WOdka

WOdka Application

Page 7: WOdka

3-5 years ago

WebObjects

WOnderWOdka

Page 8: WOdka

2 years ago

WebObjects

WOnder

WOdka

Page 9: WOdka

1 years ago

WebObjects

WOnder

WOdka

Page 10: WOdka

today

WebObjects

WOnder

WOdka

Page 11: WOdka

How big is WOdka?

Project Wonder WOdka

Logical Line of Code 156996 109852

59%

41%

Logical LOC

Project Wonder WOdka

Project Wonder WOdka

Comment Line of Code 79360 60001

57%

43%

Comment LOC

2013-04-13

Page 12: WOdka

unified Dashboard

Page 13: WOdka

Dashboard

• Application shared Dashboard for Developer and Administrator

• Frameworks can create Dashboard Entries and add itself to the Dashboard

• so lots of Function you can access asap after creating a WOdka Application.

Page 14: WOdka

System Properties Display

Page 15: WOdka

JQuery Framework

Page 16: WOdka

ERModernJQuery• works with Ajax Framework together

• works in D2W Apps

• more then 60 jQuery Components

• lots of Custom D2W jQuery Components

• lots of jQuery Theme Components

• Input-fields for Date, Time, DateTimestamp

• Currency with live converting

• SVG + SVG Animation, Graphs

• ... to much to write here

Page 17: WOdka

Authentication

Page 18: WOdka

Authentication

• WOdkaBaseModelFramework is including following Feature

• Whitelist IP addresses

• Blacklist IP addresses

• Login Response & Request Logging

• IP Restrictions with DNS Support

Page 19: WOdka

Authentication

• Login Screen

• Change Password Screen

• Authentication check

• Authentication password storage

Page 20: WOdka

Central person / Partial entity

Page 21: WOdka

• Central Person used for convenience of authentication

• Used in stamped objects (who created or modified an object)

• Used in virtual deletion (who deleted an object)

Central person / Partial entity

Page 22: WOdka

• When you generate Migration 0 for your app you have to make sure that you change "newTableNamed" to "existingTableNamed" for partial entities because your base model will now create the table. Y

• You can include attributes such as ID for convenience, but you wouldn't recreate them in the partial migration class.

• Relationships are created to the Partial Entity so that you do not change your base model.

Central person / Partial entity

Page 23: WOdka

Stamped enterprise object

Page 24: WOdka

Stamped enterprise object

• public abstract class _Person extends me.webobjects.eof.stamp.partial.WOdkaStampedPartialEnterpriseObject

• automatically records timestamps and the user responsible for object creation and modification

• add ids and timestamps to your model

Page 25: WOdka

Logical (virtual) delete

Page 26: WOdka

Logical (virtual) delete

• public static class PersonClazz<T extends Person> extends _Person._PersonClazz<T> implements IWOdkaLogicalDeleteSupport

• marks object for deletion but doesn’t actually delete the object

• qualifier ensures the object will never display in the application. System user can override this behaviour easily.

Page 27: WOdka

Domains (Multitier)

Page 28: WOdka

Domains (Multi-tier)

• Framework Domain integration

• switching between Domains

• unified CoreQualifier

• automatically D2W Handling

• Template Qualifier (TODO)

Page 29: WOdka

Avatar integration

Page 30: WOdka

Avatar integration

• WOdkaDisplayGravatar

• D2W CustomCompnents

Page 31: WOdka

Roles and Permissions

Page 32: WOdka

Roles and Permissions• Person n:n Roles support

• each Roles can have unlimited Access permissions

• Access permissions to

• Navigationbar

• SubNavigation

• BranchDelegates

• Tabs

• Section

• Property

Page 33: WOdka

Notification Center

Page 34: WOdka

Notification Center

ERNotificationCenter

Application

WOdkaQuartzScheduler

call NotificationCenter for doing some Business

save to Databasesend out via Quartz ...

FAX SMS MAILHTML

MAILMD

MAILMassMail

RabbitMQ

ServerSync APNSREST

Prowl

Page 35: WOdka

Woopra integration

Page 36: WOdka
Page 37: WOdka

D3W

Page 38: WOdka

new rules/entity specific rules

Page 39: WOdka

Entity Specific Rules• Each entity has its own rule model.

( This makes Development much more easier if you are working in a Team )

• After running the App the first time, it will create all D2W Model-files and standard Rules automatically.

• Default rules for each entity are EOGenerated in the class files for cutting and pasting into RuleModeler if you need.

Page 40: WOdka

Rule Abbreviations• EN is short form for entity.name

• # represents the value of the Entity Name derived from the model where the rule is located

• EN = ‘#’ =>

• Allows you to write generic rules for all entities that only apply in the model where the rule is located

• You can efficiently copy and paste rules from model to model without having to modify them

Page 41: WOdka

Rule Abbreviations cont.

• PC = pageConfiguration

• DPK = displayPropertyKeys

• crud = ‘1100’, isEntityInspectable, isEntityEditable, isEntityDeletable (3-4 Rules you can access now with 1 Rule)

Page 42: WOdka

improved Rules

• "completed | doneBy"

• "-completed|doneBy"

• "testPattern.modernID{testPattern.id} | testPattern"

• " English:nameInEnglish | Japanese:nameInJapanese "

• ...

Page 43: WOdka

D2W Rule Validation

Page 44: WOdka

D2W Rule Validation

• wrote a Attribute name not correct?

• Misspelling ?

• wrong Relationship ?

• changes some Name in your EO Modeler and get screwed?

Have you seen this with D2W?

Page 45: WOdka

D2W Rule Validation

• run D2W Validation and it will show all your Errors

Page 46: WOdka

easy custom component paged2w

Page 47: WOdka

easy custom component page

// creating a CustomPage is easier than ever

public WOComponent customPageAction() { CustomPageInterface cpi = D2W.factory().customPageForComponentNamed(CustomSamplePage.class.getSimpleName(), session()); return (WOComponent) cpi; }

Page 48: WOdka

Navigation handled without rules

Page 49: WOdka

NavigationMenu.plistWAY 1 :

{ name = "CustomPage"; action = "session.navController.errorPageAction";},

// set the action to session.navController.<<MethodName>>// this will call your NavigationController

// the controller will look like

public class NavigationController extends NavigationD2WControllerBase

public WOComponent errorPageAction() { ErrorPageInterface epi = D2W.factory().errorPage(session()); epi.setMessage("[[Error Message]]"); epi.setNextPage(session().context().page()); return (WOComponent) epi; }

// last you have to create the navigationState in the D2W Model1011 : pageConfiguration = 'CreateUser' => navigationState = "Master.user.createUser" [com.webobjects.directtoweb.Assignment]

Page 50: WOdka

NavigationMenu.plist (NEW)WAY 2 : NEW

{ name = "Todo"; action = "session.handlers.todo.todoTodo.listToDoAction"; children = ("TodoTodo", "TodoCategory");},{ name = "Messages"; action = "session.handlers.messages.chatMessages.queryMessagesAction"; children = ("ChatMessages");},

// set the action to session.handlers.<<navigationState>>.<<D2WAction>>// this will calculate the navigationState and create the Action for D2W in 1 Line.// No need to write 100’s of navigationState Rules anymore

Page 51: WOdka

NavigationQuery

Page 52: WOdka

NavigationQuery

This feature will display a Querybox in the TopMenu Area so the user can perform a quick search if needed.For example, if he is looking for the Barcode of a product, he doesn’t have to navigate first to a query page, he can go directly to the quick query box.

Page 53: WOdka

Button Delegate

Page 54: WOdka

Button Delegate

• Rule : 601 : EN = 'Todo' => nextPageDelegate = "me.webobjects.delegate.button.TodoButtonDelegate" [er.directtoweb.ERDDelayedObjectCreationAssignment]

Page 55: WOdka

Button Delegate/**

* me.webobjects.delegate.button.TodoButtonDelegate */public class TodoButtonDelegate extends ERMD2WEXTBranchDelegate { /* ERQMD2WBranchDelegate */

//******************************************************************** // sampleOne //********************************************************************

@D2WDelegate ( scope = "", availableTasks = "inspect", availablePages = "InspectToDo" ) public WOComponent sampleOne(WOComponent sender) { // Initialize Utility Method ユーティリティー・メソッドの初期化 setSender(sender);

// ... do your stuff here System.err.println(object()); // ... do your stuff here

return sender().context().page(); }

Page 56: WOdka

Button Delegate(Confirm)

Page 57: WOdka

Confirm

• Rule : 601 : EN = 'Todo' => nextPageDelegate = "me.webobjects.delegate.button.TodoButtonDelegate" [er.directtoweb.ERDDelayedObjectCreationAssignment]

Page 58: WOdka

Confirm

Page 59: WOdka

Button Delegate(CSV Export)

Page 60: WOdka

CSV Export

• Rule : 601 : EN = 'Todo' => nextPageDelegate = "me.webobjects.delegate.button.TodoButtonDelegate" [er.directtoweb.ERDDelayedObjectCreationAssignment]

• 601 : EN = 'Todo' => target_showCsvOutput = "_blank" [com.webobjects.directtoweb.Assignment]

Page 61: WOdka

Button Delegate(CSV Import)

Page 62: WOdka
Page 63: WOdka

CSV Import• 603 : EN = '#' => importDelegateName =

"me.webobjects.delegate.csv.ToDoImporter" [com.webobjects.directtoweb.Assignment]

• 603 : EN = '#' => importPropertyKeys = ("name", "level", "description") [com.webobjects.directtoweb.Assignment]

• 603 : EN = '#' => importSkipLines = "1" [com.webobjects.directtoweb.Assignment]

• <wo:CSVImport entityName="Product" skipLines="0" keys="$keysUC" delegateClass="com.ksroom.delegate.csv.ProductImporter" useSelector="true" />

Page 64: WOdka

Button Delegate(Pick List)

Page 65: WOdka

Pick List

• Rule : 601 : EN = 'Todo' => nextPageDelegate = "me.webobjects.delegate.button.TodoButtonDelegate" [er.directtoweb.ERDDelayedObjectCreationAssignment]

Page 66: WOdka

Pick List/**

* me.webobjects.delegate.button.TodoButtonDelegate */public class TodoButtonDelegate extends ERMD2WEXTBranchDelegate { /* ERQMD2WBranchDelegate */

//******************************************************************** // pickSample //********************************************************************

@D2WDelegate ( scope = "", availableTasks = "pick", availablePages = "ListToDo" ) public WOComponent pickSample(WOComponent sender) { // Initialize Utility Method ユーティリティー・メソッドの初期化 setSender(sender);

// ... do your stuff here System.err.println(objects()); // ... do your stuff here

return parentComponent(); }

Page 67: WOdka

Button Delegate(Migration Data Creation)

Page 68: WOdka

Migration Data Creation

• 602 : EN = '#' => nextPageDelegate = "me.webobjects.migration.WOdkaMigrationMySQLDelegate" [er.directtoweb.ERDDelayedObjectCreationAssignment]

• 602 : EN = '#' => target_showMigrationCode = "_blank" [com.webobjects.directtoweb.Assignment]

Page 69: WOdka

Migration Data Creation

602 : EN = '#' => migrationDelegateSubEntities = ("ToDoCategory") [com.webobjects.directtoweb.Assignment]

Page 70: WOdka

Fast User switching

Page 71: WOdka

Fast User switching

• following Rule you can find in WOdkaBaseModel Framework

95 : (PC = 'InspectPerson' and session.application.isDevelopmentMode = 1) => nextPageDelegate = "me.webobjects.delegate.button.PersonDebugButtonDelegate" [er.directtoweb.ERDDelayedObjectCreationAssignment]

Page 72: WOdka

Fast User switching

Go to Inspect Person you will find a Branch Button there.

to go back to your Main Developer Account

but :back: into the NavigationQuery

Page 73: WOdka

Modernlook

Page 74: WOdka

D2W Custom Components

Retina CheckboxesGoogle Maps

pList Editor

Page 75: WOdka

ModernlookCSS3

Page 76: WOdka

default Modernlook

Domain switching

Page 77: WOdka

Training Application

• 100 : *true* => isTrainingApp = "true" [com.webobjects.directtoweb.BooleanAssignment]

Page 78: WOdka

CSS3 Button with Hover effect

Buttons are all now CSS3created with a new D2WButtons class

Page 79: WOdka

CSS3 Navigationmenu

100 : *true* => useCss3TopMenu = "true" [com.webobjects.directtoweb.BooleanAssignment]

Page 80: WOdka

MultiLanguage SupportLanguage Switching

Page 81: WOdka

MultiLanguage SupportLanguage Switching

Language Switching Domain Switching

Page 82: WOdka

Gumby

Page 83: WOdka

Gumby our D2W SASS Skin

Page 84: WOdka

Gumby our D2W SASS Skin

Page 85: WOdka

SnoWOman 1.5

Page 86: WOdka

SnoWOman 1.5

• CMS System

• D2W List-page can now add to a CMS Page

• D2W Inspect-page (coming in future releases)

Page 87: WOdka

JQueryMobile D2W

Page 88: WOdka

JQueryMobile D2WLogin

Page 89: WOdka

REST AuthenticationREST Template and D2W Support

Page 90: WOdka

REST AuthenticationREST Template and D2W Support

• automatically REST Templates creations

• D2W Rest Support

• iOS Core Model Creation (coming soon)

• automatically iOS Code Creation (coming soon)

Page 91: WOdka

One more thing...

Page 92: WOdka

D2WModeler

2.0

Page 93: WOdka

ANT build scripts• improved build scripts for Apps and Framework

• upload to Server support after build

EO Templates• Partial Support & Access Permission for each Entity

Jenkins Templatesnew Application Templates

Page 94: WOdka

Thanks to• Masahiko TANI - A10 Objects Inc., (Japan)

• Hiroyuki FUKUI - Astonish Create (Japan)

• David Holt - CSCW Systems Corporation (Canada)

Special Thanks to• Paul YU - Green orchid llc (USA)

Page 95: WOdka

Thank YouWOWODC

2013