neilja.net
all i know is great code
projects et cetera
the man (present & past)
Open-source ain't paying so well. These guys have been a tad more generous:
other stuff
life ain't all ones and zeroes
welcome to neilja.net
neilja.net is ye online presence of Neil O'Toole. I'm currently the Web Platform Architect at Teradata, where I run the Teradata Developer Exchange, and was previously the Chief Architect on Teradata Viewpoint Right before that, I was the Enterprise Portal & Identity Management Architect at SAIC, a Fortune 500 science & engineering firm. This site is the gathering place for the development-related stuff that I do outside of the day job.
So, in addition to the day job, I work on a bunch of (mostly) open source projects, including Apache Commons-Collections, NetTool, and Interruptible RMI, and I'm a member of the Expert Group for JSR-261 (JAX-WSA). Prior to SAIC, I did have some other day jobs, including a stint at Cape Clear, where I worked on some of the earliest Web Services technology. That's back when we were about to go public any day now, and then... booo.
So, what are these projects I speak of?
- NetTool - web & network debugger
- JSR-261 - JAX-WSA (Web Services Addressing)
- Interruptible RMI - interrupt IO-blocked RMI calls
- NotifyingCollectionss - receive events when your collection is modified
- Commons Collections - an Apache Jakarta library for manipulating collections
- Elastic Email - Drupal module to integrate with the ElasticEmail mail service.
Read all about 'em below.
NetTool
Web & Network Debugger
NetTool is a developer tool for debugging and testing networked applications, with a specific emphasis on webapps and web services (i.e. HTTP-based applications). It has been the main focus o' late. There's two components to NetTool: a TCP tunnel, and a HTTP client (like a browser).
The HTTP Client (shown here) allows the user to manually create HTTP messages, using all the usual HTTP methods;
set headers & cookies; use
basic authorization; and so on.
The TCP Tunnel allows the use to view traffic tunneled between two TCP endpoints, useful for debugging web
applications and web services, etc..
Both the HTTP Client and the TCP Tunnel
support SSL, so you can use NetTool to, for example, create an SSL tunnel to bypass a filtering proxy, should
you wish to do so ;-)
There's more extensive documentation available here.
I started working on NetTool in 1999 to scratch a very specific itch of mine, and then it sort of festered away by itself for few years. In late 2005, it received a complete rewrite and (just as importantly) facelift, and now looks about as good as a Swing app can. At last count, NetTool had been downloaded about 3500 times. I'm sure my mother was responsible for 3400 of those.
JSR-261
JAX-WSA (Web Services Addressing)
It's really not as exciting as it sounds, but I'm a member of the Expert Group for JSR-261: JAX-WSA. Which when fully expanded is Java Specification Request 261: Java API for XML - Web Services Addressing. Actually, that's not fully expanded at all, some nested acronyms there... How about Java Specification Request 261: Java Application Programming Interface for eXtensible Markup Language - Web Services Addressing. Now, that's a title. What do we do? Well, a JSR basically defines a new API and/or library for the coming versions of the Java platform. So, this Expert Group is defining such an API for the Web Services Addressing spec. And what, pray tell, is Web Services Addressing? Well, unless you're working directly with the underlying mechanics of Web Services, you probably never need to know, but I'll give you the definition:
WS-Addressing provides transport-neutral mechanisms to address Web services and messages. Specifically, this specification defines XML elements to identify Web service endpoints and to secure end-to-end endpoint identification in messages. This specification enables messaging systems to support message transmission through networks that include processing nodes such as endpoint managers, firewalls, and gateways in a transport-neutral manner.
Succinct. BTW, if you're in need of assistance navigating the Web Services standard alphabet soup, BEA have a page listing some (or all?) of the specs.
Interruptible RMI
Library for interrupting threads stuck in blocking RMI IO
Once upon a time, I was working on the assignment for the
SCJD certification. The project was
a classic client-server application, with an RMI server, and a Swing-based GUI, which you could use to book
hotel rooms or some such. One of the project requirements was to provide record locking, such that only one
instance of the client could edit the hotel room entry at once. Fairly standard stuff. So, when the user
clicks Edit Room in the client GUI, the client makes an RMI call to acquireLock, and when that
method returns, the client can then call update, and so on. But if another client already has the lock,
then the acquireLock method will block until the lock becomes available. In that case, my app shows a
pleasant dialog like this:
Obviously you, as the user, would like to be able to click Cancel. And obviously you, as the developer, would
like the RMI thread that's stuck in the remote acquireLock method to return promptly. But you, as
the developer, would be sorely disappointed, because the RMI thread will continue to block. Indefinitely!
And from this outrage, thus was born the Interruptible RMI library.
NotifyingCollections
Receive events when your collection is modified
NotifyingCollections is a decorator package that provides
event-based notification functionality for the Collections API.
Decorators are provided for Collection, List, Set, SortedSet, Map and SortedMap.
The iterators and sub-views (e.g. List#subList) are also first class decorators.
Right, better fess up right now, the package currently available for download is pretty old and decrepit. The documentation may not match the source, the binaries may not match the 1's and 0's, and so on. All usual disclaimers apply. I am currently (May 2006) working on the JDK5 version, so I won't be posting an update until that's finished. Apologies, loyal legions of NotifyingCollections users.
A collection is decorated using the usual static method pattern, e.g.:
NotifyingCollection nc = NotifyingCollections.notifyingCollection( c );
There are two types of listeners. A 'post-listener' implements the CollectionListener
interface, and it receives a CollectionEvent after the actual modification has occurred (hence the 'post' in 'post-listener').
public interface CollectionListener extends EventListener
{
void collectionEventOccurred(CollectionEvent event);
}
A 'pre-listener' implements the VetoingCollectionListener
interface, and it receives an event before the modification occurs.
This gives the pre-listener a chance to veto the proposed modification before it actually happens.
public interface VetoingCollectionListener extends EventListener
{
void vetoableModificationOccurring( CollectionEvent event );
}
Commons Collections
Apache Jakarta library building on the Collections framework
The Java Collections Framework is one of my favourite parts of the JDK. It's small, clean, and focused. Relatively speaking. Well, it's better than Swing. The Commons Collections library is an Apache Jakarta project that builds on the standard Collections framework and adds a bunch of useful functionality, such as additional interfaces (e.g. Bag), adapter classes, many iterator implementations, and so on. I'm a committer on the project.