MONTREAL JUNE 30, JULY 1ST AND 2ND 2012




Dynamic Elements
Johann Werner
NUREG GmbH
Outline


•   What are components

•   Different common types

•   Dynamic components
Components

•   reusable pieces of representation + functionality

•   WebObjects comes with many
    (e.g. WOBody, WORepetition, WOString, …)

•   Wonder adds a whole bunch
    (e.g. AjaxModalContainer, ERXLocalizedString, …)
Components
      Component API
      Code
      Template
      Binding declarations
      Info file
Standard Component


•   subclass of WOComponent

•   automatic push/pull of binding values

•   preserves state
Standard Component
Parent                                Code                                          Template

[…]                                   public class MyString extends WOComponent {   <wo:str value="$value" />
<wo:MyString value="Hello World" />   	   public String value;
[…]
                                      	   public MyString(WOContext context) {
                                      	   	   super(context);
                                      	   }
                                      }
Non-Synchronizing Component


•   manual push/pull of binding values
➡ less overhead
•   preserves state
Non-Synchronizing Component
Parent                                Code                                                       Template

[…]                                   public class MyString extends WOComponent {                <wo:str value="$value" />
<wo:MyString value="Hello World" />   	   public MyString(WOContext context) {
[…]                                   	   	    super(context);
                                      	   }

                                      	   @Override
                                      	   public boolean synchronizesVariablesWithBindings() {
                                      	   	   return false;
                                      	   }

                                      	   public String value() {
                                      	   	   return (String) valueForBinding("value");
                                      	   }
                                      }
Non-Synchronizing Component
Parent                                Code                                                       Template

[…]                                   public class MyString extends WOComponent {                <wo:str value="$^value" />
<wo:MyString value="Hello World" />   	   public MyString(WOContext context) {
[…]                                   	   	    super(context);
                                      	   }

                                      	   @Override
                                      	   public boolean synchronizesVariablesWithBindings() {
                                      	   	   return false;
                                      	   }
                                      }
Stateless Component

•   manual push/pull of binding values
➡ less overhead
•   no state

•   single shared instance*
➡ less memory, fewer Java object-creations
Stateless Component
Parent                                Code                                          Template

[…]                                   public class MyString extends WOComponent {   <wo:str value="$^value" />
<wo:MyString value="Hello World" />   	   public MyString(WOContext context) {
[…]                                   	   	    super(context);
                                      	   }

                                      	   @Override
                                      	   public boolean isStateless() {
                                      	   	   return true;
                                      	   }
                                      }
Stateless Component
Parent                                Code                                          Template

[…]                                   public class MyString extends WOComponent {   <wo:str value="$^value" />
<wo:MyString value="Hello World" />   	   private Object myVar;
[…]                                   	
                                      	   public MyString(WOContext context) {
                                      	   	    super(context);
                                      	   }

                                      	   @Override
                                      	   public boolean isStateless() {
                                      	   	   return false;
                                      	   }
                                      	
                                      	   @Override
                                          public void reset() {
                                              super.reset();
                                              myVar = null;
                                          }
                                      }
Dynamic Component
•   subclass of WODynamicElement

•   no template
➡ less memory, faster
•   direct access to bindings (WOAssociation)

•   direct access to children elements

•   must be thread-safe!
Dynamic Component
Parent                                Code

[…]                                   public class MyString extends WODynamicElement {
<wo:MyString value="Hello World" />   	   private WOAssociation value;
[…]
                                      	   public MyString(String name, NSDictionary<String, WOAssociation> associations, WOElement template) {
                                      	   	   super(name, associations, template);
                                      	   	   value = associations.get("value");
                                      	   }

                                      	   @Override
                                      	   public void appendToResponse(WOResponse response, WOContext context) {
                                      	   	   WOComponent component = context.component();
                                      	   	   response.appendContentString((String) value.valueInComponent(component));
                                      	   }
                                      }
Demo
Demo Results


•   The more specialized component class the faster it is

•   Stateless and dynamic components create less Java objects
When should I use…
Standard components

•   for pages, big blocks
Non Synchronizing components

•   smaller components that are used often

•   binding has

    •   different name as the variable to hold it

    •   no variable counterpart
When should I use…
Stateless components

 •   no state necessary

 •   memory optimization
Dynamic components

 •   no state necessary

 •   complex output generation

 •   access to child elements
Component Class Tree


                                        Object




                                    WOElement




            WODynamicElement    WOHTMLBareString   WOComponent




             WODynamicGroup       AjaxComponent    D2WComponent       ERXComponent        JSComponent




                       WOHTMLDynamic-              D2WStateless-   ERXNonSynchronizing-
AjaxDynamicElement
                          Element                   Component          Component




           WOHTMLURLValued-                                           ERXStateless-
                                        WOInput
               Element                                                 Component
Component Class Tree


                                        Object




                                    WOElement




            WODynamicElement    WOHTMLBareString   WOComponent




             WODynamicGroup       AjaxComponent    D2WComponent       ERXComponent        JSComponent




                       WOHTMLDynamic-              D2WStateless-   ERXNonSynchronizing-
AjaxDynamicElement
                          Element                   Component          Component




           WOHTMLURLValued-                                           ERXStateless-
                                        WOInput
               Element                                                 Component
Component Class Tree


                                                              Object

                ERXLoremIpsum,
                ERXWOSwitch, …
                                                          WOElement

   AjaxHighlight,
   ERXWORepetition, …
                                  WODynamicElement    WOHTMLBareString        WOComponent

AjaxHyperlink,                                            AjaxFunctionLink,
AjaxSubmitButton, …                                       ERXJavaScript, …
                                   WODynamicGroup       AjaxComponent        D2WComponent      ERXComponent        JSComponent


                                                                         WOBody,
                                             WOHTMLDynamic-
                                                                         WOFrame, …
                                                                           D2WStateless-    ERXNonSynchronizing-
                      AjaxDynamicElement
                                                Element                        Component        Component


                                                                              ERXSubmitButton,
                                 WOHTMLURLValued-
                                                              WOInput
                                                                              WOCheckBox, ERXStateless-
                                                                                           …
                                     Element                                                     Component
Component Class Tree


                                         Object




                                    WOElement




            WODynamicElement     WOHTMLBareString           WOComponent




             WODynamicGroup       AjaxComponent             D2WComponent       ERXComponent        JSComponent




                       WOHTMLDynamic-                       D2WStateless-   ERXNonSynchronizing-
ERXDynamicElement
                          Element                            Component          Component




                      WOHTMLURLValued-                                         ERXStateless-
AjaxDynamicElement                                WOInput
                          Element                                               Component
Dynamic Base Classes


•   ERXDynamicElement in ERXExtensions

•   AjaxDynamicElement in Ajax
DEMO
Creating Dynamic Element

•   extend ERXDynamicElement / AjaxDynamicElement

•   appendToResponse

    •   response.appendContentString(…)

    •   appendTagAttributeToResponse(response, name, value)

    •   appendChildrenToResponse(response, context)
Creating Dynamic Element

•   xxxValueForBinding(name, [default,] component)

•   ContextData

    •   beforeProcessing(context)

    •   afterProcessing(context)
MONTREAL JUNE 30, JULY 1ST AND 2ND 2012




Q&A

Dynamic Elements

  • 1.
    MONTREAL JUNE 30,JULY 1ST AND 2ND 2012 Dynamic Elements Johann Werner NUREG GmbH
  • 2.
    Outline • What are components • Different common types • Dynamic components
  • 3.
    Components • reusable pieces of representation + functionality • WebObjects comes with many (e.g. WOBody, WORepetition, WOString, …) • Wonder adds a whole bunch (e.g. AjaxModalContainer, ERXLocalizedString, …)
  • 4.
    Components Component API Code Template Binding declarations Info file
  • 5.
    Standard Component • subclass of WOComponent • automatic push/pull of binding values • preserves state
  • 6.
    Standard Component Parent Code Template […] public class MyString extends WOComponent { <wo:str value="$value" /> <wo:MyString value="Hello World" /> public String value; […] public MyString(WOContext context) { super(context); } }
  • 7.
    Non-Synchronizing Component • manual push/pull of binding values ➡ less overhead • preserves state
  • 8.
    Non-Synchronizing Component Parent Code Template […] public class MyString extends WOComponent { <wo:str value="$value" /> <wo:MyString value="Hello World" /> public MyString(WOContext context) { […] super(context); } @Override public boolean synchronizesVariablesWithBindings() { return false; } public String value() { return (String) valueForBinding("value"); } }
  • 9.
    Non-Synchronizing Component Parent Code Template […] public class MyString extends WOComponent { <wo:str value="$^value" /> <wo:MyString value="Hello World" /> public MyString(WOContext context) { […] super(context); } @Override public boolean synchronizesVariablesWithBindings() { return false; } }
  • 10.
    Stateless Component • manual push/pull of binding values ➡ less overhead • no state • single shared instance* ➡ less memory, fewer Java object-creations
  • 11.
    Stateless Component Parent Code Template […] public class MyString extends WOComponent { <wo:str value="$^value" /> <wo:MyString value="Hello World" /> public MyString(WOContext context) { […] super(context); } @Override public boolean isStateless() { return true; } }
  • 12.
    Stateless Component Parent Code Template […] public class MyString extends WOComponent { <wo:str value="$^value" /> <wo:MyString value="Hello World" /> private Object myVar; […] public MyString(WOContext context) { super(context); } @Override public boolean isStateless() { return false; } @Override public void reset() { super.reset(); myVar = null; } }
  • 13.
    Dynamic Component • subclass of WODynamicElement • no template ➡ less memory, faster • direct access to bindings (WOAssociation) • direct access to children elements • must be thread-safe!
  • 14.
    Dynamic Component Parent Code […] public class MyString extends WODynamicElement { <wo:MyString value="Hello World" /> private WOAssociation value; […] public MyString(String name, NSDictionary<String, WOAssociation> associations, WOElement template) { super(name, associations, template); value = associations.get("value"); } @Override public void appendToResponse(WOResponse response, WOContext context) { WOComponent component = context.component(); response.appendContentString((String) value.valueInComponent(component)); } }
  • 15.
  • 16.
    Demo Results • The more specialized component class the faster it is • Stateless and dynamic components create less Java objects
  • 17.
    When should Iuse… Standard components • for pages, big blocks Non Synchronizing components • smaller components that are used often • binding has • different name as the variable to hold it • no variable counterpart
  • 18.
    When should Iuse… Stateless components • no state necessary • memory optimization Dynamic components • no state necessary • complex output generation • access to child elements
  • 19.
    Component Class Tree Object WOElement WODynamicElement WOHTMLBareString WOComponent WODynamicGroup AjaxComponent D2WComponent ERXComponent JSComponent WOHTMLDynamic- D2WStateless- ERXNonSynchronizing- AjaxDynamicElement Element Component Component WOHTMLURLValued- ERXStateless- WOInput Element Component
  • 20.
    Component Class Tree Object WOElement WODynamicElement WOHTMLBareString WOComponent WODynamicGroup AjaxComponent D2WComponent ERXComponent JSComponent WOHTMLDynamic- D2WStateless- ERXNonSynchronizing- AjaxDynamicElement Element Component Component WOHTMLURLValued- ERXStateless- WOInput Element Component
  • 21.
    Component Class Tree Object ERXLoremIpsum, ERXWOSwitch, … WOElement AjaxHighlight, ERXWORepetition, … WODynamicElement WOHTMLBareString WOComponent AjaxHyperlink, AjaxFunctionLink, AjaxSubmitButton, … ERXJavaScript, … WODynamicGroup AjaxComponent D2WComponent ERXComponent JSComponent WOBody, WOHTMLDynamic- WOFrame, … D2WStateless- ERXNonSynchronizing- AjaxDynamicElement Element Component Component ERXSubmitButton, WOHTMLURLValued- WOInput WOCheckBox, ERXStateless- … Element Component
  • 22.
    Component Class Tree Object WOElement WODynamicElement WOHTMLBareString WOComponent WODynamicGroup AjaxComponent D2WComponent ERXComponent JSComponent WOHTMLDynamic- D2WStateless- ERXNonSynchronizing- ERXDynamicElement Element Component Component WOHTMLURLValued- ERXStateless- AjaxDynamicElement WOInput Element Component
  • 23.
    Dynamic Base Classes • ERXDynamicElement in ERXExtensions • AjaxDynamicElement in Ajax
  • 24.
  • 25.
    Creating Dynamic Element • extend ERXDynamicElement / AjaxDynamicElement • appendToResponse • response.appendContentString(…) • appendTagAttributeToResponse(response, name, value) • appendChildrenToResponse(response, context)
  • 26.
    Creating Dynamic Element • xxxValueForBinding(name, [default,] component) • ContextData • beforeProcessing(context) • afterProcessing(context)
  • 27.
    MONTREAL JUNE 30,JULY 1ST AND 2ND 2012 Q&A