WebObjects/Wirehose/Content Management

WireHose provides a powerful, flexible foundation for building content management systems in WebObjects, based on the concept of tagging and indexing content.

Tags
WHTag objects represent metadata which can be arranged in an arbitrary hierarchy and assigned to taggable objects. Tags can be arranged into any hierarchy required. A tag can be uniquely identified by its tagpath, which is a slash-delimited string indicating its position in the hierarchy such as "Animals/Cats/Black cats/Budu". You use static methods in WHTag create and retrieve tags, and assign them to taggable objects. You can subclass WHTag to implement access control, workflow or other special applications. The com.wirehose.base.engage package defines several WHTag subclasses which implement access control for taggable objects. WHRevision is a WHTag subclass which provides support for versioning taggable objects.

Taggable objects
WHTaggable defines an interface for objects which can be categorized and fetched by tags. A taggable object can have any number of tags. You can add taggable support to your existing enterprise object entities by adding a few relationships and implementing the WHTaggable interface, which provides a default implementation as a static inner class. WireHose also includes Xcode templates to create new taggable objects from scratch.

Indexable objects
WHIndexable defines an interface for objects which can be indexed and fetched by keywords. You can add indexable support to your existing enterprise object entities by implementing the WHIndexable interface and adding a few relationships. WireHose also includes Xcode templates to create new indexable objects from scratch. Indexable objects are indexed through the WHTextIndexer utility class.

Fetching taggable and indexable objects
WHTagDataSource is an EODataSource, suitable for use with display groups, which fetches taggable and indexable objects by tags and keywords. WHTagDataSource is optimized for performance, and includes fine-tunable caching and entity pruning so expensive fetches are minimized. You can filter fetched objects by entity or interfaces implemented, and control its SQL generation through several Java properties.

''Starting content used with permission of Gary Teter. WireHose and the eyeball-and-arrows logo are trademarks of Gary Teter.''