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 Architect Emeritus At Large for Teradata Corporation, in San Diego, California. 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. For the bio, see the java.net blog.

This site isn't updated that regularly, despite the small army of leprechauns and fairies I have slaving away 24/7. They've really gone to the dogs lately. But I am trying to post updates for the various projects on the java.net blog, so you might be better off checking there.

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 Teradata and 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?

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).

NetTool HTTP Client 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:

Locking Dialog 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.