For WebObjects developers

engifer is built on WO's ideas, not a clone of it.

The same

  • Components: template plus Java class, .wo folders and .wod files included. See Templating.
  • Bindings and KeyValueCoding.
  • Component actions: the three phases, pageWithName().
  • Direct actions, sessions, wrappers with <wo:content />, and Wonder's inline <wo:…> tags.
  • .woa bundles, run by wotaskd and JavaMonitor.

Different

  • Java collections and java.time, not Foundation (NSArray, NSTimestamp, …).
  • No EOF. Move to Cayenne or another ORM first.
  • Java 25+, a standard Maven project, the classpath instead of NSBundle.
  • Few annotations. APIs are plain typed Java.
  • NGRequest and NGResponse are interfaces. Make responses with NGResponses.
  • Sessions come from the context: session() in a component, context.session() elsewhere.

Names

WebObjectsengifer
WOApplicationNGApplication
WOComponentNGComponent
WOContextNGContext
WOSessionNGSession
WORequest, WOResponseNGRequest, NGResponse
WODynamicElementNGDynamicElement
WOAssociationNGAssociation
WODirectActionNGDirectAction
WOResourceManagerNGResourceManager
WOString, WOConditional, …NGString (str), NGConditional (if), … See Dynamic elements
NSKeyValueCodingNGKeyValueCoding

URLs

WebObjectsengifer
Component actions/wo//no/
Direct actions/wa//na/
Resources/wr//nr/

WO adaptor URLs (/cgi-bin/WebObjects/MyApp.woa/…, /Apps/WebObjects/MyApp.woa/…) work: the prefix is stripped.

Deployment

Built into a .woa by vermilingua. Under wotaskd and JavaMonitor:

  • ✅ Lifebeats (WOLifebeatEnabled, WOHost, WOPort, WOApplicationName, WOLifebeatDestinationPort, WOLifebeatInterval)
  • ✅ Stop from JavaMonitor
  • ✅ Requests through the WO Apache adaptor
  • ❌ Refuse new sessions (TODO, #55)
  • ❌ Statistics (TODO, #55)

See Deployment.

Porting

(TODO: step-by-step guide.) The path:

  1. Java collections instead of Foundation; Cayenne instead of EOF.
  2. Project Wonder → wonder-slim.
  3. wonder-slim → engifer. A compatibility layer for common WO APIs is being designed.

API differences

(TODO)