WOdka

Preview:

Citation preview

WOdkaKen ISHIMOTO (K’s Room Japan)

David HOLT (CSCW System Corporation)

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

• WOdka is a Framework that originally was developed in Japan

• WebObjects Development by K’s Room & A10

What is WOdka

Who works with WOdkaKen Ishimoto

Paul Yu

David Holt

Paul Halliday

Masahiko Tani

Hiroyuki Fukui

Amedeo Mantica

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

WOdka Structure & History

WebObjects

WOnder

WOdka

WOdka Application

3-5 years ago

WebObjects

WOnderWOdka

2 years ago

WebObjects

WOnder

WOdka

1 years ago

WebObjects

WOnder

WOdka

today

WebObjects

WOnder

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

unified Dashboard

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.

System Properties Display

JQuery Framework

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

Authentication

Authentication

• WOdkaBaseModelFramework is including following Feature

• Whitelist IP addresses

• Blacklist IP addresses

• Login Response & Request Logging

• IP Restrictions with DNS Support

Authentication

• Login Screen

• Change Password Screen

• Authentication check

• Authentication password storage

Central person / Partial entity

• 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

• 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

Stamped enterprise object

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

Logical (virtual) delete

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.

Domains (Multitier)

Domains (Multi-tier)

• Framework Domain integration

• switching between Domains

• unified CoreQualifier

• automatically D2W Handling

• Template Qualifier (TODO)

Avatar integration

Avatar integration

• WOdkaDisplayGravatar

• D2W CustomCompnents

Roles and Permissions

Roles and Permissions• Person n:n Roles support

• each Roles can have unlimited Access permissions

• Access permissions to

• Navigationbar

• SubNavigation

• BranchDelegates

• Tabs

• Section

• Property

Notification Center

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

Woopra integration

D3W

new rules/entity specific rules

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.

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

Rule Abbreviations cont.

• PC = pageConfiguration

• DPK = displayPropertyKeys

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

improved Rules

• "completed | doneBy"

• "-completed|doneBy"

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

• " English:nameInEnglish | Japanese:nameInJapanese "

• ...

D2W Rule Validation

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?

D2W Rule Validation

• run D2W Validation and it will show all your Errors

easy custom component paged2w

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; }

Navigation handled without rules

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]

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

NavigationQuery

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.

Button Delegate

Button Delegate

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

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(); }

Button Delegate(Confirm)

Confirm

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

Confirm

Button Delegate(CSV Export)

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]

Button Delegate(CSV Import)

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" />

Button Delegate(Pick List)

Pick List

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

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(); }

Button Delegate(Migration Data Creation)

Migration Data Creation

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

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

Migration Data Creation

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

Fast User switching

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]

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

Modernlook

D2W Custom Components

Retina CheckboxesGoogle Maps

pList Editor

ModernlookCSS3

default Modernlook

Domain switching

Training Application

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

CSS3 Button with Hover effect

Buttons are all now CSS3created with a new D2WButtons class

CSS3 Navigationmenu

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

MultiLanguage SupportLanguage Switching

MultiLanguage SupportLanguage Switching

Language Switching Domain Switching

Gumby

Gumby our D2W SASS Skin

Gumby our D2W SASS Skin

SnoWOman 1.5

SnoWOman 1.5

• CMS System

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

• D2W Inspect-page (coming in future releases)

JQueryMobile D2W

JQueryMobile D2WLogin

REST AuthenticationREST Template and D2W Support

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)

One more thing...

D2WModeler

2.0

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

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)

Thank YouWOWODC

2013

Recommended