[Something should be here, but it's missing.] (none)
[Something should be here, but it's missing.]WireHose News
NewsProductsDownloadDevelopersAbout Us

What's New in WireHose Server 4.0.2

The WireHose 4.0.2 update is a new wirehosebase.jar which replaces the file at /Library/Frameworks/WireHoseBase.framework/Resources/Java.

This update improves memory usage and fixes a deadlocking bug in WHEOCache when snapshot reference counting is enabled. (It's recommended that if you enable snapshot reference counting you should call EOEditingContext.setInstancesRetainRegisteredObjects(true) during application startup.)

This update also introduces a new API for WHEOCache: setCacheExpiresWindow(int seconds). If this value is set, cache entries will timeout based on cacheExpires seconds plus a random number of seconds up to the value of the cacheExpiresWindow. The default value is 0; a reasonable setting to use is 10 percent of the value of cacheExpires.

The WireHose 4.0.2 update requires Java 1.5.

What's New in WireHose Server 4.0

WireHose Server 4.0 is now free to download and use. License keys are no longer required, and there are no developer workstation performance limits.

WireHose Server 4.0 went through over 54 external beta releases over a two-year period, and there have been too many bug fixes, performance enhancements and new features to comprehensively list. Here are a few of the most notable changes:

This release sees the first official introduction of WHEOCache, which is a threadsafe mutable dictionary for fetching and caching enterprise objects with some very cool features. Big chunks of WireHose, including WHTag and WHCachingDataSource subclasses, have been rewritten to use eocaches internally.

A few classes in the com.wirehose.layout package have been moved to the WireHoseBase framework (WHApplicationHelper, WHComponent, WHHyperlink, WHPage, WHSessionHelper). The source to the rest of the WireHoseLayoutSupport framework is now included as sample code.

Windows development is no longer supported or documented in this release since Apple has deprecated all Windows WebObjects development tools. However, many developers use Eclipse for WebObjects development, and there's no reason you couldn't use Eclipse to develop WireHose applications.

The WireHose Developers Guide and sample applications such as Conexiones have not been updated for this release.

WireHose Server 3.0.3 Release Notes

This release adds compatibility with Xcode 1.1 and WebObjects 5.2.3.

WireHose Server 3.0 Release Notes

There are many improvements, enhancements and new features in WireHose 3.0. This document gives a brief overview of the most significant changes.

Windows developer tools

This release reintroduces support for application development on Windows. WireHose is tightly integrated into ProjectBuilder through a new plugin which provides easy access to templates and project setup. Sample projects, tutorials, templates and tools are all available in either Mac OS X or Windows format.


The all-new WireHose Developers Guide teaches you how to build web applications using WireHose by leading you through the process of developing a personalizable news aggregator. It covers the overall architecture of a WireHose application, key portions of the WireHose API, and discusses the use of WireHose tools. It also includes information about advanced WireHose topics such as access control and multiple affiliate support. It is available in two editions, one for developers using Mac OS X, and one for developers using Windows.

Sample code

The WireHoseDemo, ControlCenter, WireHoseDemoLayouts, WireHoseDemoSupport, WireHoseImporter and WireHoseIndexer sample projects have been replaced by the new NewsDemo project.

NewsDemo is a personalizable news aggregator which combines articles from multiple categories into topics. It provides users the ability to personalize access to news and traffic cams, as well as letting them choose from several possible layouts.

NewsDemo was designed to handle the high-traffic personalization needs of television station and newspaper news portals. NewsDemo also includes an administration interface which allows editors to create collections of pre-built topics for users to choose from.

The Conexiones sample application has also been cleaned up and simplified.

The WireHoseWOBuilderBindings framework project no longer needs to be left open in Project Builder on Mac OS X to show WireHose bindings in WebObjects Builder.

Layout support

Channel reordering popup menus have been moved from channel editor components to WHSwitchRenderer. This simplifies channel editor construction and allows developers to implement custom reordering strategies for particular layouts, pages or areas by substituting a custom switcher.

Support for reordering global channels and channels with negative importance has been improved. Channel reordering also now handles cases where users are permitted to edit only a subset of the channels in an area. See WHArea and the Edit direct action for details.

Building page components has been made simpler. Localization of page-level strings can now be handled through WHComponent's @string.key bindings. (Bindings such as helper.@stringInPage.key bindings are still supported.) Page components can now use the layout dictionary to resolve boolean and integer bindings through WHPage's implementation of booleanForBinding and intForBinding.

Reusable components

This release introduces WHShowTagDataSource, a component which allows embedding a WHTagDataSource in a web page, through bindings such as optionalTags and keywordString. You can set the optionalTags and requiredTags bindings to an individual tag, arrays of tags, or a string or arrays of strings which will be interpreted as tagpaths.

WHImageButton has been enhanced to better match the capabilities of WHHyperlink. It now provides directActionName, helperPageName, pageName, queryDictionary and rewriteRule bindings.

The WHShowTagPath component has a new showTop binding, which controls whether or not the root of the tag hierarchy is rendered.

WireHose editor, renderer and switcher components now support an optional hideDetails binding.

WHEditFetcher has been enhanced so it handles drill fetchers, fetcher factories and drill fetcher factories. It also supports the hideDetails binding, presenting a summary of hidden options if hideDetails resolves to true.

WHTagDriller has two new bindings: the current top tag can be specified as a tagpath through the tagPath binding; and showTagPath controls whether the top tag's path should be rendered with a WHShowTagPath component.

The localized strings defined for WHSearchBox have been simplified. There are two new bindings: showBrowsePrompt controls whether or not the "or click to browse..." prompt is rendered; and displayInline controls whether the search box's form is rendered as a block-level or inline element.

Page components

The WHEditFactoriesPage is new for this release. It functions similarly to WHCustomizePage, and allows users to enable and disable channel factories, and edit their settings.

WHSearchResultsPage has been enhanced with an "add this to my page" button, which will create a custom fetcher for the user based on the current search string. It also has a new page-level binding, showSearchBox, which controls whether or not to include a WHSearchBox on the page.

WHEditObjectPage adds a new duplicateObject method, which allows a user to clone an object, and has been enhanced to support editing channel factories and global channels.


New in this release is the WHImporter class, which provides several methods for importing resources from XML sources and inserting them into the database. It handles tagging, indexing, pruning duplicates and updating existing resources. WHLog now defines a DebugGroupImporting constant to control logging while importing.


WHConcreteFetcher no longer posts unnecessary ShouldInvalidateCache notifications when fetchers are fetched or created. Notifications are now always posted whether a datasource has been created or not, resolving issues with faulting fetchers into peer or nested editing contexts for editing.

Access control

A new "Create" operation has been added to the WireHoseEngageSupport framework. WHApplicationHelper now defines a userCanCreate delegate method.

A default implementation of the application helper's delegate interface has been added to WHApplicationHelper, making it easier to provide resort to the default behavior for userCanEdit, userCanCreate, userCanView and filteredUserViewableObjects in custom applications.

WHEngageApplication's implementation of filteredUserViewableObjects has been enhanced to handle non-taggable objects.


The new WHDefaultTagEntity system property specifies a default tag entity to be used when not otherwise encoded into tagpaths. Among other things, this allows Drill direct action URLs to be much cleaner in applications which use the WireHoseEngageSupport framework.

A new displayDictionariesForTags method provides an easy way to disambiguate tagpaths when presenting several similarly-named tags, as in a popup menu.

The tagsForPathsWithPrefix method has been deprecated in favor of tagsForPaths, which allows specifying a prefix and/or a suffix.

Multiple affiliates

Multiple affiliate support has been simplified, and WireHose applications are no longer required to support this feature. Setting the WHDisableAutoSubEntities property to YES is enough to turn the feature off, except in cases where affiliate-based subentities have either been manually modeled or created explicitly in code.

To model an entity which may become the parent of affiliate-based subentities, set the entity so it is not abstract and does not have a restricting qualifier on the affiliate property. WHEnterpriseObject's createSubEntityForAffiliate will add the appropriate restricting qualifier to the parent entity when creating the first subentity. To that end, WireHose user and channel factory entities are no longer marked as abstract, and do not have restricting qualifiers.

WHEnterpriseObject now provides a createAndInsertInstance method, which functions similarly to the one defined in EOUtilities. The WireHose version provides an additional parameter, affiliateName, which is used to specify the affiliate the newly created instance should belong to.

If there is an affiliate-based subentity available for the specified entity, then the returned object will be of that entity, otherwise it will be of the specified entity. In either case, the affiliate property will be set on the newly created object if the entity has a class property named "affiliate".

Enterprise objects which inherit from WHEnterpriseObject now automatically set their dateAdded, affiliate, entityType and isIndexed properties during awakeFromInsertion, if the attributes exist. The affiliate property is set based on the object's entity name and the value returned by the new baseEntityName method.


To simplify creation of certain kinds of channel factories, a forceChannelFactory method has been added to WHEnterpriseObject. A provided dictionary of values serves as the basis for a fetch, and if no matching factories are found, a new one will be inserted and returned.

Logging caused by DebugGroupSQLGeneration has been improved.

WHTagDataSource now works properly with database adaptors which use bind variables.

The WHOpenBasePrototypes framework now uses a char(1) for the whBoolean prototype by default.

Bugs and other undocumented features have been fixed in WHCachingDataSource, WHConcreteFetcher, WHHyperlink, WHComponent, WHMatrixTable, WHApplicationHelper, WHEnterpriseObject, WHPermission, WHUser, WHLookupDictionary and WHEngageTag, among others.

Known issues in WireHose 3.0

Shared object loading is not supported in this release due to issues with shared object support in WebObjects 5.2. Applications should be launched with WHDisableSharedObjectLoading = YES to disable shared object loading. This issue is expected to be resolved in a future release of WireHose and WebObjects.

New in WireHose 2.0.2

Information about EOModel adaptor dictionary manipulation is now always logged, regardless of NSLog's current debug level or groups.

WHShowObject now always calls its reset() method during each phase of the request-response loop whether it is stateless or not, preventing some problems when used as the basis for a stateful component.

A bug which prevented the Search direct action from working in all circumstances has been fixed.

WHTagDataSource's setEntitiesToFetch() method now works properly.

Some minor bugs in the ControlCenter and WireHoseIndexer sample projects have been fixed.

A sample SQL file for adding support to FrontBase for the EngageSupport framework has been added.

Some issues with the Mac OS X installer package have been resolved.

New in WireHose 2.0.1

This release resolves some issues with support for OpenBase, the WireHoseEngageSupport framework and the Conexiones application.

New in WireHose 2.0


WireHose documentation has been significantly expanded and revised. The javadoc reference now includes extensive overviews for each important class, and each method now documents parameters and return types. In addition, there is a new Getting Started guide, which takes a developer step-by-step from "Hello, world" to a simple, yet functional, content management system. The Developer Overview has been completely revised for this version, as has the properties reference. The original Getting Started guide, which covers operation of the WireHoseDemo sample news portal, has been moved to the NewsDemoGettingStarted folder.

Project Builder templates

WireHose 2.0 now comes with several templates for use with Project Builder, which make building common WireHose structures significantly faster. Included are templates for creating new WireHose applications and frameworks, as well as pages, wrappers, resources, editors, renderers, and more.

WebObjects Builder will not normally display the custom bindings available for WireHose classes since they are provided as compiled frameworks. WireHose provides a Project Builder project called WireHoseWOBuilderBindings, which provides stub method declarations for WireHose classes. Inside the project folder is a dummy framework called WireHoseWOBuilderBindings.framework. As long as you have the WireHoseWOBuilderBindings project open, and your project contains a reference to the dummy framework, WebObjects Builder will properly display WireHose bindings.

The sample SQL files have been moved to database-specific directories, and now include multiple default setups. Also included is a default set of stemmed keywords, which can improve indexing performance as common words are already in the database.

Debugging support

The new com.wirehose.base.WHLog interface contains constants which can be used in conjunction with NSLog's allowedDebugLevel and allowDebugLoggingForGroups to control the information that WireHose classes will log during execution. Constants are provided to control exception logging, HTTP request and response header logging, EOModel manipulation, layout dictionary lookups, tag creation, custom SQL generation and keyword indexing.

Regular expressions library

WireHose 2.0 now bundles the "package pat" regular expression library for rapid string manipulation.

Access control support

The WHApplicationHelper.Delegate interface defines several methods which developers can use to customize whether or not a user can view, edit or delete objects. WHComponent now provides several new bindings, including "@userCanEdit.key.path" and "@viewableObjects.key.path" for making access control decisions within bindings.

Custom user subclasses

The WHApplicationHelper.Delegate interface methods userFromRequest and guestUserForAffiliate now allow developers to customize user authentication and guest user creation. Developers can also use the WHUserEntityName property to control which user entities are used. Other changes to WHUser include removal of attributes which would not be required in all applications, and several new methods for filtering and sorting user channels, global channels and factories.

Roles-based access control

The WireHoseEngageSupport framework defines several classes which work together to provide roles-based access control for taggable objects, including tags. Also included is support for instantiation of new groups and permissions from templates. Permissions, groups and operations are hierarchical and inheritable.

Conexiones demo

The Conexiones sample application is a fully-functional content management system which uses the WireHoseEngageSupport framework to demonstrate use of groups, templates, permissions, and more. This demo application allows students, parents and staff in an educational environment to easily upload and share content in multiple classrooms, categories and groups. Developers are encouraged to adapt it to other environments, such as an enterprise or small-business knowledge management intranet.

Taggable and indexable support

The WHTaggable and WHIndexable interfaces now provide default implementations, making it much easier to add support to existing enterprise object classes.


The various fetcher classes in WireHose 1.0 have been completely rearchitected for improved performance, reusability and extensibility. WHCachingDataSource is a new abstract class which provides all the necessary infrastructure for fetching enterprise objects into a cache, returning subsets of objects from the cache, and invalidating the cache when necessary. WireHose provides two concrete implementations, WHTagDataSource, used for fetching taggable and indexable objects via keywords and tags, and WHQualifierDataSource, used for fetching arbitrary entities via a qualifier. WHConcreteFetcher provides an abstract implementation of a channel which owns a caching datasource. WHTagFetcher and WHQualifierFetcher use this implementation to provide personalized access to fetchers for users as a channel.

To prevent caches from becoming stale, WHFetcher now defines the ShouldInvalidateCache notification. Fetchers whose cache should be invalidated when a particular object changes can register for these notifications. For fetchers that deal with enterprise objects, the notification object will be the globalID of the object which has changed; WHTag and WHTaggable.DefaultImplementation automatically post these notifications for WHTag objects.

Improvements to WHTag

WHTag has several new methods for accessing a tag's ancestors and descendents. Tags accessed through the tagForPath methods are now cached; the size of the cache can be controlled via the WHTagCacheSize property. Developers can now provide a dictionary of values to be set on newly-created tags; the special entry WHTag.ThisTag is used to refer to the tag which is being created. The storage of entity hints for tags has been optimized. WHTag now supports a default affiliate static attribute, which is used to control what affiliate tags belong to if not otherwise specified.

Application helper startup

WHApplicationHelper now posts two notifications during startup. Developers can listen for these to control automatic subentity creation and other WireHose startup behaviors.

Component bindings

Component bindings provided by WHComponent and WHSessionHelper have been significantly streamlined and enhanced. WHSessionHelper now provides bindings such as "helper.@userAgentContains.safari" for browser sniffing, "helper.@itemInPage.key" for page-level layout dictionary lookups, and "helper.@stringInPage.key" for page-level string localization. WHComponent now provides several new bindings, including "@userCanEdit.key.path" and "@viewableObjects.key.path" for making access control decisions within bindings.

An issue with resolving localized strings defined in frameworks has been resolved. Localized strings are now cached for faster access.

Layout dictionary

The structure of the layout dictionary has been simplified and clarified a bit. Instead of being a page-level key, "wrapper" is now at the same level as "pages". Entries under the "editors" and "renderers" keys are now recursive to parent entities, so a single entry for any abstract entity will usually suffice (rather than separate entities for each affiliate-based subentities, though that still works). The "autoSubEntities" key is is still supported but is now largely unused due to improvements in WHEnterpriseObject and WHApplicationHelper's automatic subentity creation behavior (see Dynamic subentity creation for more information).

New reusable components

Three new reusable components have been added: WHImageButton is a button which automatically detects if it has an image and/or if it is in a form, and renders itself as a link, submit button or image button as appropriate. WHShowTagPath will render a tag's tagpath, optionally relative to an ancestor tag, with each tag in the path as a separate link to the Drill direct action. WHHTMLString renders HTML text, switching in renderers for taggable objects tagged with a tag identified by a tagpath.

Reusable component improvements

There are many improvements to the reusable components provided with WireHose 2.0. Some of the more notable changes: You can now provide your own WHSwitchEditor and WHSwitchRenderer components, as well as your own WHTagDriller. WHSwitchRenderer adds several bindings such as showEditButton, accessDeniedString, buttonAlign, cellpadding, cellspacing and tableWidth. WHBorderedTable and WHSmartBorderedTable now provide tableBackgroundImage binding as well as the ability to omit all four edges of a table. WHCustomizePage now has a channelsQualifier for filtering available channels. WHHyperlink has been rewritten for improved threadsafety, and WHDynamicElement is no longer supported.

Components in general have been rewritten to make them easier to subclass, especially by classes that live in the default package.

Direct actions

Writing direct action methods that properly maintain session ID's in cookies or URLs is now simpler through use of the new shouldRedirectForCookieCheck method.

Dynamic subentity creation

WireHose 2.0 significantly enhances support for handling multiple sites from a single set of databases via subentities. Most WireHose base entities, such as WHTag, WHTagFetcherFactory, WHUser, etc., have an affiliate property, which is used to identify to which affiliate a particular object belongs. The current affiliate name is controlled by the WHDefaultAffiliate property.

The property WHUserEntityName controls which base entity WHApplicationHelper will use when fetching and creating users. The actual entity fetched and created will be an affiliate-based subentity of this entity for the default affiliate. For example, if WHDefaultAffiliate is "Seattle" and WHUserEntityName is "WHUser" (the default), users and guest users will be of the "SeattleUser" entity.

You can override WHApplicationHelper's automatic subentity creation in several ways. See the WHApplicationHelper documentation for details. For more information about how WireHose 2.0 handles dynamic subentity creation, see the WHEnterpriseObject documentation.

Boolean attribute support

There is no standard way to store booleans in a database; some support BOOLEAN columns, while others may store a "Y" or "N" in a CHAR(1) column, or a zero or one in an INTEGER. WHEnterpriseObject provides several utility methods which make it easy to deal with varying definitions for boolean attributes in a database-independent fashion.

Binary primary key support

The WireHoseJDBCPlugIn has been removed in favor of WHEnterpriseObject's new EODatabaseContext and EOModelGroup delegate support methods. WireHose will generate binary primary keys and encode a reference to the entity directly in the primary key itself. This can improve performance by avoiding extra fetches when resolving to-one faults against abstract entities.

Encoded global ID's are also now significantly shorter; a typical integer primary key will be encoded in 13 characters. Encoded global ID's for entities with binary primary keys will be slightly longer depending on the bitlength chosen for the primary key.

Utility classes

WHTextIndexer's API has been revised. When the new shouldCreateIfMissing argument is true, fetching keywords takes place in groups of 30, and saving new keywords happens one at a time to help enforce uniqueness constraints in multithreaded or multiple instance deployment environments.

WHStopWordsDict is now WHStopWordsList, and it expects just a plain text file of stopwords (plist markers will be stripped if present, however). Provided stopwords are now stemmed before use.

WHTextIndexer's resourceForPropertyAsString now uses WOApplication's resourceManager, if available, to enable rapid turnaround of layout dictionary editing, etc. Also now only repeats log msgs every 25 times (useful when WHDisableLayoutDictionaryCaching property is YES).


In no particular order:

Added PoweredByWireHose.gif to WireHoseLayoutSupport framework assist in beautifying applications.

Constant names no longer have a "WH" prefix.

Channel instances are no longer taggable by default. Channel factories are.

All "asString" accessors have been removed, as coercion is now handled in takeValueForKey.

Enterprise object arguments and return values of type Number have been narrowed to take Integer where appropriate.

Whenever possible, WireHose methods will access the model group via a provided editing context rather than using the default model group. Exceptions to this behavior are documented.

WHStreamingResource is now used purely as a grouping interface.

Unnecessary "synchronized" declarations have been removed from static methods.

WireHose prototype attributes have been renamed to be prefixed with "wh".

Copyright ©2000-2016 Gary Teter. All rights reserved. WireHose and the eyeball-and-arrows logo are trademarks of Gary Teter.