Proposal to Deprecate IStatsRecorder
Warning
This is currently in DRAFT status
Abstract
This document proposes a moderate improvement to the uPortal 2 codebase in that it recommends the deprecation of the IStatsRecorder interface (and its default implementations) and replacement with a much more flexible system based on the Spring ApplicationEventPublisher and Event Listeners.
Classes and Interfaces to be familiar with:
Spring Classes
Known Issues with Current IStatsRecorder
As implemented, the current IStatsRecorder interface has numerous limitations which decrease its usefulness.
Hard-coded event types - The IStatsRecorder interface identifies several different types of stats (I'll call them "events" to be more general). However, these are the only events that the IStatsRecorder interface can handle. Identifying a new (potentially local event) requires changes to the IStatsRecorder interface.
Hard-coded event parameters - The IStatsRecorder interface also denotes which parameters are passed with a recorded event. Since this is hard-coded, adding new parameters again requires modifications to the interface.
Code duplication - Because events are implemented as methods on the IStatsRecorder interface, this limits the code sharing that can occur for recording stats.
Required to "handle" all events - Even if you're not interested in an event, you're required to at least acknowledge its existance by generating a stub method.
Incremental Improvements offered by this Patch
Only required to handle events you wish to handle -only register an "EventHandler" for an event you wish to do something about
Easily "handle" an event in multiple ways by plugging in one or more EventHandlers for an event
Easil add new events to handle by publishing a new event (i.e. create Portlet Events which the traditional IStatsRecorder doesn't handle)
The events to handle becomes a configuration issue rather than a code issue
Moves "plumbing" code into Spring configuration files
Allows you to easily leverage Spring components in events handling (i.e. access to Spring managed objects, datasources, etc.)
Possible Issues with New Approach
Generation of more objects (the number of objects is still pretty small)
Future Potential Improvements
Removal of "EventsPublishing" from uPortal core code base and into AOP advices as EventsPublishing is a cross-cutting concern
Use AspectJ to completely decouple event handling aspects from the portal core:
Initial, brainstorm with the following infrastructure: - Abstract aspect to capture the the event handling protocol - Subaspects for each type of event This will be a true modular and non-intrusive solution completely decoupled from the core. Could even be compiled into a reusable aspect library and applied to the uP core as needed (LTW, etc.) public abstract aspect AbstractPortalEventHandler { abstract pointcut eventBoundary(Object eventSource); after(Object eventSource) : eventBoundary(eventSource) { handleEvent(eventSource); } protected abstract void handleEvent(Object eventSource); } ... and then have subaspects like: public aspect XxxPortalEventHandler extends AbstractPortalEventHandler {...}
What's Currently Included in the Patch
Modifications to core code base to call Spring Events Publisher instead of StatsRecorder
Addition of EventListener to capture PortalEvents
All StatsRecorder methods have been mapped to appropriate PortalEvent
ThreadedEventListener to mimic ThreadPool StatsRecorder
SimpleEventListener for when threads are not needed (probably most cases)
IStatsRecorderEventHandlerAdapter to convert a current StatsRecorder implementation to be used with the new system
LoggingEventHandler to mimic behavior of LoggingStatsRecorder
PrintingEventHandler to mimic behavior of PrintingStatsRecorder
NOTE: This patch was created from HEAD a couple of weeks ago. Its also slightly overzealous in its removal of classes that would probably most benefit from deprecation.