SlideShare une entreprise Scribd logo
1  sur  36
Télécharger pour lire hors ligne
Getting Started with Wonder
                     Kieran Kelleher               WOWODC 2010 Montreal
                     Green Island Consulting LLC
                     SmartleadsUSA LLC
                     SmartMix Technologies LLC




Friday, September 3, 2010
Getting Started with Wonder
                            •   Get you started using Wonder

                                •   Wonder installation and upgrade - Binaries and Source

                                •   Create a Wonder Application

                                •   Convert existing non-Wonder to a Wonder Application

                            •   Review a few useful features of Wonder

                                •   ERXProperties, Properties files usage, ERXEC usage

                                •   ERPrototypes and Overriding prototypes


Friday, September 3, 2010
What Is It?
                            •      World’s largest Open Source WebObjects project

                            •      Umbrella Project for

                                 •       Patches and Bug Fixes to WebObjects

                                 •       Very Useful Extensions to Standard WebObjects Functionality

                                 •       Reusable WOComponents

                                 •       Powerful Reusable Frameworks

                                 •       Example Applications
  * Some verbiage reproduced from Jonathon “Wolf” Rentzsch’s 2002 CAWUG Presentation



Friday, September 3, 2010
Brief History Snippet
                            •   A long long time ago in a galaxy far far away...

                                •   dotcom: “eResource” (“ER*”), then became NetStruxr

                                •   WOnder is acronym for

                                    •   WebObjects Nodes for Distributing E-Resources

                                •   NetStruxr closed

                                    •   SourceForge project named WONDER was created (~2002)



Friday, September 3, 2010
What’s in It

         GoogleChart           ERChronic       ... and much more!   (db *)PlugIn     ERModernLook



            ERTaggable         ERCaptcha          ERProfiling        ERIndexing     ERModernDefaultSkin



        ERAttachment         ExcelGenerator    ERPDFGeneration        ERRest         ERModernD.T.W.



                 Ajax       JavaWOExtensions       WOOgnl           WOJRebel         ERNeutralLook



         ERExtensions            ERJars          ERPrototypes       ERJavaMail       ERDirectToWeb



Friday, September 3, 2010
Why Should You Use It?
                            •   Bug fixes to standard WebObjects frameworks

                            •   Even Apple uses Wonder (Branch 2_0_0?)

                            •   Improved and Replaced Functionality

                            •   Extended and Additional Functionality

                            •   The source code has an educational benefit

                            •   Why reinvent and debug the wheel?



Friday, September 3, 2010
How Do You Get It?

        “Semi-Pro” Way*                                                      “Pro” Way*




                            Binaries                                                      Source



 * Terms coined by David Holt on wonder-disc mailing list on May 12, 2010

Friday, September 3, 2010
Binary Frameworks Initial Installation
   $ mkdir WonderBinaries54


   $ cd WonderBinaries54


   $ curl -O http://webobjects.mdimension.com/hudson/job/Wonder54/lastSuccessfulBuild/artifact/dist/Wonder-Frameworks.tar.gz


   $ tar -xzvf Wonder-Frameworks.tar.gz


   $ sudo cp -Rvf *.framework /Library/Frameworks




         For WebObjects 5.3, replace “54” above with “53”
Friday, September 3, 2010
Binary Frameworks Upgrade Installation
   $ cd WonderBinaries54


   $ for FRAMEWORK in `echo *.framework`; do sudo rm -r /Library/Frameworks/${FRAMEWORK}; done


   $ rm -r *


   $ curl -O http://webobjects.mdimension.com/hudson/job/Wonder54/lastSuccessfulBuild/artifact/dist/Wonder-Frameworks.tar.gz


   $ tar -xzvf Wonder-Frameworks.tar.gz


   $ sudo cp -Rvf *.framework /Library/Frameworks




         For WebObjects 5.3, replace “54” above with “53”
Friday, September 3, 2010
Source Frameworks Initial Installation
   $ svn co http://wonder.svn.sourceforge.net/svnroot/wonder/trunk/Wonder --revision <ARG> WonderSource



   $ cd WonderSource



   $ ant -Dwonder.patch=54 frameworks; sudo ant -Dwonder.patch=54 frameworks.install     [WO 5.4]



                            OR



   $ ant frameworks; sudo ant frameworks.install      [WO 5.3]




         <ARG> = HEAD to get latest version. Type svn --help checkout for more.
Friday, September 3, 2010
Source Frameworks Upgrade Installation
   $ cd ~/Roots/



   $ for FRAMEWORK in `echo *.framework`; do sudo rm -r /Library/Frameworks/${FRAMEWORK}; done



   $ cd /path/to/WonderSource



   $ svn update --force --accept theirs-full --revision <ARG>



   $ ant -Dwonder.patch=54 clean; ant -Dwonder.patch=54 frameworks; sudo ant -Dwonder.patch=54 frameworks.install   [WO 5.4]



                        OR



   $ ant clean; ant frameworks; sudo ant frameworks.install         [WO 5.3]




Friday, September 3, 2010
Working with Wonder Source

                            •   Some Advantages of working with Source over Binaries:

                                •   Learn much about WebObjects and EOF (and java dev styles?)

                                •   Easily browse and search the source

                                •   Work with a specific svn version (teams, quality control)

                                •   Discover the Hidden Treasures (Don’t miss Chuck Hill later)

                            •   Note ERXExtensions classpath file contents for 5.3 vs 5.4 .....


Friday, September 3, 2010
Demo


                            •   Linking Wonder Source projects to your Workspace

                            •   Creating a Wonder app

                            •   What is different between a Wonder app and a Standard app




Friday, September 3, 2010
Integrating Wonder into Your
                                     Existing Application
                            •   Add Frameworks

                            •   Adjust Application, Session and DirectAction superclasses

                            •   Use ERXGenericRecord instead of EOGenericRecord

                            •   Configure Wonder-specific Properties

                                •   copy/paste from a new temp Wonder app as a starting point



Friday, September 3, 2010
Integrating Wonder into an
                                     Existing Application


                            •   DEMO




Friday, September 3, 2010
Configuring Wonder’s Features
                            •   Wonder is configured, more or less, using Properties files.

                                •   Check comments and contents of each framework’s
                                    Properties file

                            •   Where to find Documentation

                                •   Java API

                                •   Framework “Documentation” directory

                                •   http://wiki.objectstyle.org/confluence/display/WONDER/Home

                                •   Examine Source code

Friday, September 3, 2010
Select Features

                            •   ERXProperties

                            •   EOModel Connection Dictionary using Properties

                            •   ERXEC usage

                            •   ERPrototypes

                            •   Over-riding Prototypes via ERXModel and ERXModelGroup



Friday, September 3, 2010
ERXProperties

                            •   A variety of ways to organize Properties

                            •   ERXProperties replaces and extends deprecated NSProperties

                                •   many convenient utility methods including property coercion

                            •   log4j configured via Properties

                            •   Understanding how ERXProperties works can facilitate better
                                team organization, app administration and general happiness :-)



Friday, September 3, 2010
The Standard WebObjects Way

 Override

                            Properties                    Framework Resources
                             Properties
                              Properties


                            Properties                    Application Resources


                            WebObjects.properties         [user.home] dir


                        -DpropertyName=propertyValue      Command Line arguments
                        -DpropertyName=”property Value”




Friday, September 3, 2010
Properties: The Wonder Way
          Properties
           Properties
            Properties
          Properties.<username>
                                              Framework Resources                                                          Override
           Properties.<username>
            Properties.<username>

          Properties                          Application Resources
          WebObjects.properties               [user.home] dir

          ( file1, file2, file3 )                [er.extensions.ERXProperties.OptionalConfigurationFiles]
                                                 (absolute filepaths AND/OR application Resource filenames)
          Properties OR                       [er.extensions.ERXProperties.machinePropertiesPath]
          /<appName>/Properties                  (absolute filepath, default “/etc/WebObjects”)

          Properties.dev                       [er.extensions.ERXProperties.devPropertiesName]
                                                  (file extension, App Resource, default “dev”)
          Properties.<username>                Application Resources
          -DpropertyName=propertyValue         Command Line arguments
          -DpropertyName=”property Value”


          @see er.extensions.foundation.ERXProperties.pathsForUserAndBundleProperties(boolean)
          Note: [propertyname] denotes a system property (so properties are determining the loading of more properties!)
Friday, September 3, 2010
Examples of Properties fiddling...
   ## We always want to use @@ as the delimiter and NOT a single @
   er.extensions.ERXSimpleTemplateParser.useOldDelimiter=false

   app.directActionPassword=passw0rd
   er.extensions.ERXJUnitPassword = @@app.directActionPassword@@
   er.extensions.ERXLog4JPassword = @@app.directActionPassword@@
   er.extensions.ERXGCPassword = @@app.directActionPassword@@
   er.extensions.ERXDirectAction.ChangeSystemPropertyPassword = @@app.directActionPassword@@

   app.smtpserver=192.168.3.142
   WOSMTPHost=@@app.smtpserver@@
   log4j.appender.myMail.SMTPHost=@@app.smtpserver@@


                                                                                               Automatically generated into Resources by build




   ## Optional properties to load
   er.extensions.ERXProperties.OptionalConfigurationFiles=deploy.properties

   log4j.appender.A2.file=/var/log/webobjects_apps/@@build.app.bundle.name@@-@@WOPort@@.log

   log4j.appender.myMail.Subject=Log4jError (@@build.app.bundle.name@@ @@host@@ @@WOPort@@)




Friday, September 3, 2010
Common Dev/Deploy Properties Strategy




Friday, September 3, 2010
EOModel Connection Dictionary
       WebObjects Way




Friday, September 3, 2010
EOModel Connection Dictionary
     Wonder Way - Properties File:
                            # For individual eomodels
                            model.URL = jdbc:mysql://hostname/firstdatabase
                            model.DBUser = firstuser
                            model.DBPassword = firstpassword
                            model.DBDriver =
                            model.DBPlugin =



                            # Global, or default where model entry not specified
                            dbConnectURLGLOBAL = jdbc:mysql://hostname/nextdatabase
                            dbConnectUserGLOBAL = nextuser
                            dbConnectPasswordGLOBAL = nextpassword
                            dbConnectDriverGLOBAL =
                            dbConnectPluginGLOBAL =



     Wonder Way - WOMonitor Launch Arguments:
                            -Dmodel.URL=”jdbc:mysql://localhost/database?useUnicode=true&characterEncoding=UTF-8”
                            -Dmodel.DBUser=firstuser
                            -Dmodel.DBPassword=firstpassword




Friday, September 3, 2010
ERXEC
                            •   EOEditingContext subclass
                                •   EOEditingContext ec = ERXEC.newEditingContext();


                            •   supports automatic lock/unlock in R-R cycle
                                •   er.extensions.ERXEC.safeLocking=true


                                •   enabled by default for new Wonder projects

                            •   Calls ERXEnterpriseObject state transition will*/did* methods

                                •   Implemented by ERXGenericRecord


Friday, September 3, 2010
ERXEC Auto Lock/Unlock

                            •   Implicitly supported in Request-Response threads
                                •   ERXApplication._endRequest()    ... which calls ...

                                    •   ERXEC.unlockAllContextsForCurrentThread();


                            •   Background threads are your responsibility!

                                •   Here is how to do it ...




Friday, September 3, 2010
Runnable lock handling
   public class MyTask implements Runnable {

   	       public void run() {
   	       	    ERXApplication._startRequest();
   	       	    try {
   	       	    	     performTask();
   	       	    } finally {
   	       	    	     ERXApplication._endRequest();
   	       	    }
   	       }
   	
   	       private void performTask() {
   	       	    EOEditingContext ec = ERXEC.newEditingContext();

   	       	      ec.lock();
   	       	      try {

   	       	      	         // Do some EOF stuff with the ec.

   	       	      } catch (Exception e) {
   	       	      	    // handle exception
   	       	      } finally {
   	       	      	    ec.unlock();
   	       	      }
   	       }
   }

Friday, September 3, 2010
Callable lock handling
   public class MyTask implements Callable<MyResultClass> {

   	       public MyResultClass call() {
   	       	    ERXApplication._startRequest();
   	       	    try {
   	       	    	     return performTask();
   	       	    } finally {
   	       	    	     ERXApplication._endRequest();
   	       	    }
   	       }
   	
   	       private MyResultClass performTask() {
   	       	    EOEditingContext ec = ERXEC.newEditingContext();
   	       	    ec.lock();
   	       	    try {
   	       	    	     // Do some EOF stuff with the ec.

   	       	      } catch (Exception e) {
   	       	      	    // handle exception
   	       	      } finally {
   	       	      	    ec.unlock();
   	       	      }
   	       	      return myResult;
   	       }
   }


Friday, September 3, 2010
Passing Objects to a Thread
   	       public WOActionResults shuffleStudioAction() {
   	       	   Studio studio = selectedStudio();
   	       	
   	       	   EOGlobalID studioGid = (EOGlobalID) ERXEOControlUtilities.convertEOtoGID(studio);
   	       	
   	       	   ProcessStudioTask task = new ProcessStudioTask(studioGid);
   	       	
   	       	   MyExecutorServices.executorService().execute(task);
   	       	
   	       	   return null;
   	       }




Friday, September 3, 2010
Thread Hydrates EO
   public class ProcessStudioTask extends ERXRunnable {
   	
   	    private final EOGlobalID _studioGlobalID;

   	       public ProcessStudioTask(EOGlobalID studioGlobalID) {
   	       	    _studioGlobalID = studioGlobalID;
   	       }
   	
   	       @Override
   	       public void _run() {
   	       	    EOEditingContext ec = ERXEC.newEditingContext();
   	       	    ec.lock();
   	       	    try {
   	
   	       	      	         Studio studio = (Studio) ERXEOControlUtilities.convertGIDtoEO(ec, _studioGlobalID);

   	       	      } catch (Exception e) {
   	       	      	    // Handle error
   	       	      } finally {
   	       	      	    ec.unlock();
   	       	      }
   	       }

   }




Friday, September 3, 2010
ERPrototypes



                            •   DEMO




Friday, September 3, 2010
Overriding Prototypes
                       •      ERXModel and ERXModelGroup

                       •      Allow “over-riding” of prototypes based on prototype entity naming
                              conventions

                       •      Feature configured in system Properties:


                            er.extensions.ERXModelGroup.modelClassName = com.webobjects.eoaccess.ERXModel
                            er.extensions.ERXModel.useExtendedPrototypes = true
                            er.extensions.ERXModelGroup.flattenPrototypes = false




Friday, September 3, 2010
Prototypes Over-ride Order
                       •    From lowest to highest priority:

                            •   EOPrototypes

                            •   EO<adaptorName>Prototypes (Wonder has ‘Memory’ and ‘REST’ adaptor protypes)

                            •   EOJDBC<pluginName>Prototypes (Wonder database prototype names)

                            •   EOCustomPrototypes

                            •   EO<adaptorName>CustomPrototypes

                            •   EOJDBC<pluginName>CustomPrototypes

                            •   EO<modelName>Prototypes

                            •   EO<adaptorName><modelName>Prototypes

                            •   EOJDBC<pluginName><modelName>Prototypes



Friday, September 3, 2010
Override Prototypes



                            •   DEMO




Friday, September 3, 2010
Resources
                            •   http://wiki.objectstyle.org/confluence/display/WONDER/Home

                            •   http://projectwonder.blogspot.com/

                            •   http://webobjects.mdimension.com/hudson/

                                •   JavaDoc and Binaries

                                •   “Wonder53” = Wonder for WebObjects 5.3.3

                                •   “Wonder54” = Wonder for WebObjects 5.4.3

                            •   Mailing Lists

                                •   https://lists.sourceforge.net/lists/listinfo/wonder-disc

                                •   https://lists.sourceforge.net/lists/listinfo/wonder-cvs


Friday, September 3, 2010
Q&A
                     Getting Start with Wonder
                     WOWODC 2010




Friday, September 3, 2010

Contenu connexe

Similaire à Getting Started with Wonder: An Introduction

02 Objective C
02 Objective C02 Objective C
02 Objective CMahmoud
 
Xcore meets IncQuery: How the New Generation of DSLs are Made
Xcore meets IncQuery: How the New Generation of DSLs are MadeXcore meets IncQuery: How the New Generation of DSLs are Made
Xcore meets IncQuery: How the New Generation of DSLs are MadeIstvan Rath
 
Pharo Status ESUG 2014
Pharo Status ESUG 2014Pharo Status ESUG 2014
Pharo Status ESUG 2014Pharo
 
Making Fedora easier to implement with Fez
Making Fedora easier to implement with FezMaking Fedora easier to implement with Fez
Making Fedora easier to implement with Fezmrangryfish
 
Building OBO Foundry ontology using semantic web tools
Building OBO Foundry ontology using semantic web toolsBuilding OBO Foundry ontology using semantic web tools
Building OBO Foundry ontology using semantic web toolsMelanie Courtot
 
Reactive summit 2020 microsoft orleans the easy way
Reactive summit 2020   microsoft orleans the easy wayReactive summit 2020   microsoft orleans the easy way
Reactive summit 2020 microsoft orleans the easy wayJohn Azariah
 
Django è pronto per l'Enterprise
Django è pronto per l'EnterpriseDjango è pronto per l'Enterprise
Django è pronto per l'EnterprisePyCon Italia
 
Semantic web assignment 3
Semantic web assignment 3Semantic web assignment 3
Semantic web assignment 3BarryK88
 
OER for repository managers
OER for repository managersOER for repository managers
OER for repository managersNick Sheppard
 
Building a Lightweight Discovery Interface for China's Patents@NYC Solr/Lucen...
Building a Lightweight Discovery Interface for China's Patents@NYC Solr/Lucen...Building a Lightweight Discovery Interface for China's Patents@NYC Solr/Lucen...
Building a Lightweight Discovery Interface for China's Patents@NYC Solr/Lucen...OpenSource Connections
 
Entity Framework Today (May 2012)
Entity Framework Today (May 2012)Entity Framework Today (May 2012)
Entity Framework Today (May 2012)Julie Lerman
 
Django in enterprise world
Django in enterprise worldDjango in enterprise world
Django in enterprise worldSimone Federici
 
Architecting Smarter Apps with Entity Framework
Architecting Smarter Apps with Entity FrameworkArchitecting Smarter Apps with Entity Framework
Architecting Smarter Apps with Entity FrameworkSaltmarch Media
 
Devoxx France 2013 Cloud Best Practices
Devoxx France 2013 Cloud Best PracticesDevoxx France 2013 Cloud Best Practices
Devoxx France 2013 Cloud Best PracticesEric Bottard
 
Design patterns
Design patternsDesign patterns
Design patternsAlok Guha
 
Red Dirt Ruby Conference
Red Dirt Ruby ConferenceRed Dirt Ruby Conference
Red Dirt Ruby ConferenceJohn Woodell
 
Enterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptEnterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptTroy Miles
 

Similaire à Getting Started with Wonder: An Introduction (20)

02 Objective C
02 Objective C02 Objective C
02 Objective C
 
Otago vre-overview
Otago vre-overviewOtago vre-overview
Otago vre-overview
 
Xcore meets IncQuery: How the New Generation of DSLs are Made
Xcore meets IncQuery: How the New Generation of DSLs are MadeXcore meets IncQuery: How the New Generation of DSLs are Made
Xcore meets IncQuery: How the New Generation of DSLs are Made
 
Pharo Status ESUG 2014
Pharo Status ESUG 2014Pharo Status ESUG 2014
Pharo Status ESUG 2014
 
Making Fedora easier to implement with Fez
Making Fedora easier to implement with FezMaking Fedora easier to implement with Fez
Making Fedora easier to implement with Fez
 
Building OBO Foundry ontology using semantic web tools
Building OBO Foundry ontology using semantic web toolsBuilding OBO Foundry ontology using semantic web tools
Building OBO Foundry ontology using semantic web tools
 
Reactive summit 2020 microsoft orleans the easy way
Reactive summit 2020   microsoft orleans the easy wayReactive summit 2020   microsoft orleans the easy way
Reactive summit 2020 microsoft orleans the easy way
 
Eclipse e4
Eclipse e4Eclipse e4
Eclipse e4
 
Django è pronto per l'Enterprise
Django è pronto per l'EnterpriseDjango è pronto per l'Enterprise
Django è pronto per l'Enterprise
 
Semantic web assignment 3
Semantic web assignment 3Semantic web assignment 3
Semantic web assignment 3
 
OER for repository managers
OER for repository managersOER for repository managers
OER for repository managers
 
Building a Lightweight Discovery Interface for China's Patents@NYC Solr/Lucen...
Building a Lightweight Discovery Interface for China's Patents@NYC Solr/Lucen...Building a Lightweight Discovery Interface for China's Patents@NYC Solr/Lucen...
Building a Lightweight Discovery Interface for China's Patents@NYC Solr/Lucen...
 
Entity Framework Today (May 2012)
Entity Framework Today (May 2012)Entity Framework Today (May 2012)
Entity Framework Today (May 2012)
 
Django in enterprise world
Django in enterprise worldDjango in enterprise world
Django in enterprise world
 
Architecting Smarter Apps with Entity Framework
Architecting Smarter Apps with Entity FrameworkArchitecting Smarter Apps with Entity Framework
Architecting Smarter Apps with Entity Framework
 
Devoxx France 2013 Cloud Best Practices
Devoxx France 2013 Cloud Best PracticesDevoxx France 2013 Cloud Best Practices
Devoxx France 2013 Cloud Best Practices
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Stackato v5
Stackato v5Stackato v5
Stackato v5
 
Red Dirt Ruby Conference
Red Dirt Ruby ConferenceRed Dirt Ruby Conference
Red Dirt Ruby Conference
 
Enterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptEnterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScript
 

Plus de WO Community

In memory OLAP engine
In memory OLAP engineIn memory OLAP engine
In memory OLAP engineWO Community
 
Using Nagios to monitor your WO systems
Using Nagios to monitor your WO systemsUsing Nagios to monitor your WO systems
Using Nagios to monitor your WO systemsWO Community
 
Build and deployment
Build and deploymentBuild and deployment
Build and deploymentWO Community
 
Reenabling SOAP using ERJaxWS
Reenabling SOAP using ERJaxWSReenabling SOAP using ERJaxWS
Reenabling SOAP using ERJaxWSWO Community
 
Chaining the Beast - Testing Wonder Applications in the Real World
Chaining the Beast - Testing Wonder Applications in the Real WorldChaining the Beast - Testing Wonder Applications in the Real World
Chaining the Beast - Testing Wonder Applications in the Real WorldWO Community
 
D2W Stateful Controllers
D2W Stateful ControllersD2W Stateful Controllers
D2W Stateful ControllersWO Community
 
Deploying WO on Windows
Deploying WO on WindowsDeploying WO on Windows
Deploying WO on WindowsWO Community
 
Unit Testing with WOUnit
Unit Testing with WOUnitUnit Testing with WOUnit
Unit Testing with WOUnitWO Community
 
Apache Cayenne for WO Devs
Apache Cayenne for WO DevsApache Cayenne for WO Devs
Apache Cayenne for WO DevsWO Community
 
Advanced Apache Cayenne
Advanced Apache CayenneAdvanced Apache Cayenne
Advanced Apache CayenneWO Community
 
Migrating existing Projects to Wonder
Migrating existing Projects to WonderMigrating existing Projects to Wonder
Migrating existing Projects to WonderWO Community
 
iOS for ERREST - alternative version
iOS for ERREST - alternative versioniOS for ERREST - alternative version
iOS for ERREST - alternative versionWO Community
 
"Framework Principal" pattern
"Framework Principal" pattern"Framework Principal" pattern
"Framework Principal" patternWO Community
 
Localizing your apps for multibyte languages
Localizing your apps for multibyte languagesLocalizing your apps for multibyte languages
Localizing your apps for multibyte languagesWO Community
 

Plus de WO Community (20)

KAAccessControl
KAAccessControlKAAccessControl
KAAccessControl
 
In memory OLAP engine
In memory OLAP engineIn memory OLAP engine
In memory OLAP engine
 
Using Nagios to monitor your WO systems
Using Nagios to monitor your WO systemsUsing Nagios to monitor your WO systems
Using Nagios to monitor your WO systems
 
Build and deployment
Build and deploymentBuild and deployment
Build and deployment
 
High availability
High availabilityHigh availability
High availability
 
Reenabling SOAP using ERJaxWS
Reenabling SOAP using ERJaxWSReenabling SOAP using ERJaxWS
Reenabling SOAP using ERJaxWS
 
Chaining the Beast - Testing Wonder Applications in the Real World
Chaining the Beast - Testing Wonder Applications in the Real WorldChaining the Beast - Testing Wonder Applications in the Real World
Chaining the Beast - Testing Wonder Applications in the Real World
 
D2W Stateful Controllers
D2W Stateful ControllersD2W Stateful Controllers
D2W Stateful Controllers
 
Deploying WO on Windows
Deploying WO on WindowsDeploying WO on Windows
Deploying WO on Windows
 
Unit Testing with WOUnit
Unit Testing with WOUnitUnit Testing with WOUnit
Unit Testing with WOUnit
 
Life outside WO
Life outside WOLife outside WO
Life outside WO
 
Apache Cayenne for WO Devs
Apache Cayenne for WO DevsApache Cayenne for WO Devs
Apache Cayenne for WO Devs
 
Advanced Apache Cayenne
Advanced Apache CayenneAdvanced Apache Cayenne
Advanced Apache Cayenne
 
Migrating existing Projects to Wonder
Migrating existing Projects to WonderMigrating existing Projects to Wonder
Migrating existing Projects to Wonder
 
iOS for ERREST - alternative version
iOS for ERREST - alternative versioniOS for ERREST - alternative version
iOS for ERREST - alternative version
 
iOS for ERREST
iOS for ERRESTiOS for ERREST
iOS for ERREST
 
"Framework Principal" pattern
"Framework Principal" pattern"Framework Principal" pattern
"Framework Principal" pattern
 
WOver
WOverWOver
WOver
 
Localizing your apps for multibyte languages
Localizing your apps for multibyte languagesLocalizing your apps for multibyte languages
Localizing your apps for multibyte languages
 
WOdka
WOdkaWOdka
WOdka
 

Dernier

CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 

Dernier (20)

CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 

Getting Started with Wonder: An Introduction

  • 1. Getting Started with Wonder Kieran Kelleher WOWODC 2010 Montreal Green Island Consulting LLC SmartleadsUSA LLC SmartMix Technologies LLC Friday, September 3, 2010
  • 2. Getting Started with Wonder • Get you started using Wonder • Wonder installation and upgrade - Binaries and Source • Create a Wonder Application • Convert existing non-Wonder to a Wonder Application • Review a few useful features of Wonder • ERXProperties, Properties files usage, ERXEC usage • ERPrototypes and Overriding prototypes Friday, September 3, 2010
  • 3. What Is It? • World’s largest Open Source WebObjects project • Umbrella Project for • Patches and Bug Fixes to WebObjects • Very Useful Extensions to Standard WebObjects Functionality • Reusable WOComponents • Powerful Reusable Frameworks • Example Applications * Some verbiage reproduced from Jonathon “Wolf” Rentzsch’s 2002 CAWUG Presentation Friday, September 3, 2010
  • 4. Brief History Snippet • A long long time ago in a galaxy far far away... • dotcom: “eResource” (“ER*”), then became NetStruxr • WOnder is acronym for • WebObjects Nodes for Distributing E-Resources • NetStruxr closed • SourceForge project named WONDER was created (~2002) Friday, September 3, 2010
  • 5. What’s in It GoogleChart ERChronic ... and much more! (db *)PlugIn ERModernLook ERTaggable ERCaptcha ERProfiling ERIndexing ERModernDefaultSkin ERAttachment ExcelGenerator ERPDFGeneration ERRest ERModernD.T.W. Ajax JavaWOExtensions WOOgnl WOJRebel ERNeutralLook ERExtensions ERJars ERPrototypes ERJavaMail ERDirectToWeb Friday, September 3, 2010
  • 6. Why Should You Use It? • Bug fixes to standard WebObjects frameworks • Even Apple uses Wonder (Branch 2_0_0?) • Improved and Replaced Functionality • Extended and Additional Functionality • The source code has an educational benefit • Why reinvent and debug the wheel? Friday, September 3, 2010
  • 7. How Do You Get It? “Semi-Pro” Way* “Pro” Way* Binaries Source * Terms coined by David Holt on wonder-disc mailing list on May 12, 2010 Friday, September 3, 2010
  • 8. Binary Frameworks Initial Installation $ mkdir WonderBinaries54 $ cd WonderBinaries54 $ curl -O http://webobjects.mdimension.com/hudson/job/Wonder54/lastSuccessfulBuild/artifact/dist/Wonder-Frameworks.tar.gz $ tar -xzvf Wonder-Frameworks.tar.gz $ sudo cp -Rvf *.framework /Library/Frameworks For WebObjects 5.3, replace “54” above with “53” Friday, September 3, 2010
  • 9. Binary Frameworks Upgrade Installation $ cd WonderBinaries54 $ for FRAMEWORK in `echo *.framework`; do sudo rm -r /Library/Frameworks/${FRAMEWORK}; done $ rm -r * $ curl -O http://webobjects.mdimension.com/hudson/job/Wonder54/lastSuccessfulBuild/artifact/dist/Wonder-Frameworks.tar.gz $ tar -xzvf Wonder-Frameworks.tar.gz $ sudo cp -Rvf *.framework /Library/Frameworks For WebObjects 5.3, replace “54” above with “53” Friday, September 3, 2010
  • 10. Source Frameworks Initial Installation $ svn co http://wonder.svn.sourceforge.net/svnroot/wonder/trunk/Wonder --revision <ARG> WonderSource $ cd WonderSource $ ant -Dwonder.patch=54 frameworks; sudo ant -Dwonder.patch=54 frameworks.install [WO 5.4] OR $ ant frameworks; sudo ant frameworks.install [WO 5.3] <ARG> = HEAD to get latest version. Type svn --help checkout for more. Friday, September 3, 2010
  • 11. Source Frameworks Upgrade Installation $ cd ~/Roots/ $ for FRAMEWORK in `echo *.framework`; do sudo rm -r /Library/Frameworks/${FRAMEWORK}; done $ cd /path/to/WonderSource $ svn update --force --accept theirs-full --revision <ARG> $ ant -Dwonder.patch=54 clean; ant -Dwonder.patch=54 frameworks; sudo ant -Dwonder.patch=54 frameworks.install [WO 5.4] OR $ ant clean; ant frameworks; sudo ant frameworks.install [WO 5.3] Friday, September 3, 2010
  • 12. Working with Wonder Source • Some Advantages of working with Source over Binaries: • Learn much about WebObjects and EOF (and java dev styles?) • Easily browse and search the source • Work with a specific svn version (teams, quality control) • Discover the Hidden Treasures (Don’t miss Chuck Hill later) • Note ERXExtensions classpath file contents for 5.3 vs 5.4 ..... Friday, September 3, 2010
  • 13. Demo • Linking Wonder Source projects to your Workspace • Creating a Wonder app • What is different between a Wonder app and a Standard app Friday, September 3, 2010
  • 14. Integrating Wonder into Your Existing Application • Add Frameworks • Adjust Application, Session and DirectAction superclasses • Use ERXGenericRecord instead of EOGenericRecord • Configure Wonder-specific Properties • copy/paste from a new temp Wonder app as a starting point Friday, September 3, 2010
  • 15. Integrating Wonder into an Existing Application • DEMO Friday, September 3, 2010
  • 16. Configuring Wonder’s Features • Wonder is configured, more or less, using Properties files. • Check comments and contents of each framework’s Properties file • Where to find Documentation • Java API • Framework “Documentation” directory • http://wiki.objectstyle.org/confluence/display/WONDER/Home • Examine Source code Friday, September 3, 2010
  • 17. Select Features • ERXProperties • EOModel Connection Dictionary using Properties • ERXEC usage • ERPrototypes • Over-riding Prototypes via ERXModel and ERXModelGroup Friday, September 3, 2010
  • 18. ERXProperties • A variety of ways to organize Properties • ERXProperties replaces and extends deprecated NSProperties • many convenient utility methods including property coercion • log4j configured via Properties • Understanding how ERXProperties works can facilitate better team organization, app administration and general happiness :-) Friday, September 3, 2010
  • 19. The Standard WebObjects Way Override Properties Framework Resources Properties Properties Properties Application Resources WebObjects.properties [user.home] dir -DpropertyName=propertyValue Command Line arguments -DpropertyName=”property Value” Friday, September 3, 2010
  • 20. Properties: The Wonder Way Properties Properties Properties Properties.<username> Framework Resources Override Properties.<username> Properties.<username> Properties Application Resources WebObjects.properties [user.home] dir ( file1, file2, file3 ) [er.extensions.ERXProperties.OptionalConfigurationFiles] (absolute filepaths AND/OR application Resource filenames) Properties OR [er.extensions.ERXProperties.machinePropertiesPath] /<appName>/Properties (absolute filepath, default “/etc/WebObjects”) Properties.dev [er.extensions.ERXProperties.devPropertiesName] (file extension, App Resource, default “dev”) Properties.<username> Application Resources -DpropertyName=propertyValue Command Line arguments -DpropertyName=”property Value” @see er.extensions.foundation.ERXProperties.pathsForUserAndBundleProperties(boolean) Note: [propertyname] denotes a system property (so properties are determining the loading of more properties!) Friday, September 3, 2010
  • 21. Examples of Properties fiddling... ## We always want to use @@ as the delimiter and NOT a single @ er.extensions.ERXSimpleTemplateParser.useOldDelimiter=false app.directActionPassword=passw0rd er.extensions.ERXJUnitPassword = @@app.directActionPassword@@ er.extensions.ERXLog4JPassword = @@app.directActionPassword@@ er.extensions.ERXGCPassword = @@app.directActionPassword@@ er.extensions.ERXDirectAction.ChangeSystemPropertyPassword = @@app.directActionPassword@@ app.smtpserver=192.168.3.142 WOSMTPHost=@@app.smtpserver@@ log4j.appender.myMail.SMTPHost=@@app.smtpserver@@ Automatically generated into Resources by build ## Optional properties to load er.extensions.ERXProperties.OptionalConfigurationFiles=deploy.properties log4j.appender.A2.file=/var/log/webobjects_apps/@@build.app.bundle.name@@-@@WOPort@@.log log4j.appender.myMail.Subject=Log4jError (@@build.app.bundle.name@@ @@host@@ @@WOPort@@) Friday, September 3, 2010
  • 22. Common Dev/Deploy Properties Strategy Friday, September 3, 2010
  • 23. EOModel Connection Dictionary WebObjects Way Friday, September 3, 2010
  • 24. EOModel Connection Dictionary Wonder Way - Properties File: # For individual eomodels model.URL = jdbc:mysql://hostname/firstdatabase model.DBUser = firstuser model.DBPassword = firstpassword model.DBDriver = model.DBPlugin = # Global, or default where model entry not specified dbConnectURLGLOBAL = jdbc:mysql://hostname/nextdatabase dbConnectUserGLOBAL = nextuser dbConnectPasswordGLOBAL = nextpassword dbConnectDriverGLOBAL = dbConnectPluginGLOBAL = Wonder Way - WOMonitor Launch Arguments: -Dmodel.URL=”jdbc:mysql://localhost/database?useUnicode=true&characterEncoding=UTF-8” -Dmodel.DBUser=firstuser -Dmodel.DBPassword=firstpassword Friday, September 3, 2010
  • 25. ERXEC • EOEditingContext subclass • EOEditingContext ec = ERXEC.newEditingContext(); • supports automatic lock/unlock in R-R cycle • er.extensions.ERXEC.safeLocking=true • enabled by default for new Wonder projects • Calls ERXEnterpriseObject state transition will*/did* methods • Implemented by ERXGenericRecord Friday, September 3, 2010
  • 26. ERXEC Auto Lock/Unlock • Implicitly supported in Request-Response threads • ERXApplication._endRequest() ... which calls ... • ERXEC.unlockAllContextsForCurrentThread(); • Background threads are your responsibility! • Here is how to do it ... Friday, September 3, 2010
  • 27. Runnable lock handling public class MyTask implements Runnable { public void run() { ERXApplication._startRequest(); try { performTask(); } finally { ERXApplication._endRequest(); } } private void performTask() { EOEditingContext ec = ERXEC.newEditingContext(); ec.lock(); try { // Do some EOF stuff with the ec. } catch (Exception e) { // handle exception } finally { ec.unlock(); } } } Friday, September 3, 2010
  • 28. Callable lock handling public class MyTask implements Callable<MyResultClass> { public MyResultClass call() { ERXApplication._startRequest(); try { return performTask(); } finally { ERXApplication._endRequest(); } } private MyResultClass performTask() { EOEditingContext ec = ERXEC.newEditingContext(); ec.lock(); try { // Do some EOF stuff with the ec. } catch (Exception e) { // handle exception } finally { ec.unlock(); } return myResult; } } Friday, September 3, 2010
  • 29. Passing Objects to a Thread public WOActionResults shuffleStudioAction() { Studio studio = selectedStudio(); EOGlobalID studioGid = (EOGlobalID) ERXEOControlUtilities.convertEOtoGID(studio); ProcessStudioTask task = new ProcessStudioTask(studioGid); MyExecutorServices.executorService().execute(task); return null; } Friday, September 3, 2010
  • 30. Thread Hydrates EO public class ProcessStudioTask extends ERXRunnable { private final EOGlobalID _studioGlobalID; public ProcessStudioTask(EOGlobalID studioGlobalID) { _studioGlobalID = studioGlobalID; } @Override public void _run() { EOEditingContext ec = ERXEC.newEditingContext(); ec.lock(); try { Studio studio = (Studio) ERXEOControlUtilities.convertGIDtoEO(ec, _studioGlobalID); } catch (Exception e) { // Handle error } finally { ec.unlock(); } } } Friday, September 3, 2010
  • 31. ERPrototypes • DEMO Friday, September 3, 2010
  • 32. Overriding Prototypes • ERXModel and ERXModelGroup • Allow “over-riding” of prototypes based on prototype entity naming conventions • Feature configured in system Properties: er.extensions.ERXModelGroup.modelClassName = com.webobjects.eoaccess.ERXModel er.extensions.ERXModel.useExtendedPrototypes = true er.extensions.ERXModelGroup.flattenPrototypes = false Friday, September 3, 2010
  • 33. Prototypes Over-ride Order • From lowest to highest priority: • EOPrototypes • EO<adaptorName>Prototypes (Wonder has ‘Memory’ and ‘REST’ adaptor protypes) • EOJDBC<pluginName>Prototypes (Wonder database prototype names) • EOCustomPrototypes • EO<adaptorName>CustomPrototypes • EOJDBC<pluginName>CustomPrototypes • EO<modelName>Prototypes • EO<adaptorName><modelName>Prototypes • EOJDBC<pluginName><modelName>Prototypes Friday, September 3, 2010
  • 34. Override Prototypes • DEMO Friday, September 3, 2010
  • 35. Resources • http://wiki.objectstyle.org/confluence/display/WONDER/Home • http://projectwonder.blogspot.com/ • http://webobjects.mdimension.com/hudson/ • JavaDoc and Binaries • “Wonder53” = Wonder for WebObjects 5.3.3 • “Wonder54” = Wonder for WebObjects 5.4.3 • Mailing Lists • https://lists.sourceforge.net/lists/listinfo/wonder-disc • https://lists.sourceforge.net/lists/listinfo/wonder-cvs Friday, September 3, 2010
  • 36. Q&A Getting Start with Wonder WOWODC 2010 Friday, September 3, 2010