This article is part of the “Side Projects” mini-series.

Why did I rewrite JSXP for gclimbing? First because I thought it was dead. I did not know that Oliver was working on a major change too (he made a derivative web framework for commercial use out of JSXP). If I had known that we could have worked together on the update, but I didn’t.

I decided to rewrite most of the framework because there were some things that were bugging me (Oliver refactored a lot of these things, so they are not that much of a problem anymore):

  • Messy BaseServlet
  • Complicated ViewFlows
  • Hard to understand resource management
  • Too many ways to do i18n (and other things)
  • Over-generalized implementation

The Messy BaseServlet and complicated ViewFlows are somewhat interconnected. ViewFlows in JSXP are a concept similar to Spring WebFlow. They worked quite well, but the implementation was complex and ran partly outside the normal view/controller life cycle. This meant a lot of special cases and spaghetti code in the BaseServlet.

Resource management is a very powerful concept that Oliver developed. You can accomplish almost anything with resources in JSXP. For example, you could use it for internationalization (i18n). The problem is that I never fully understood it.

With JSXP we implemented not only a web framework. We implemented a generic framework where one possible implementation was a web framework. This means that we had an abstract class Application and a concrete class WebApplication. Also, we prepared our XML classes so we could theoretically exchange the XML parser. There was a class Element and a class DomElement. All of this made the web framework unnecessarily complicated. This over-generalization is typical for java projects - we made this mistake too.

For the (partial) re-implementation, I only took what I absolutely needed to create gclimbing. This means I have a web framework that I can not open source as it is. But this is no problem for me. I see it as an advantage: I am the only user, so I can break compatibility, change features, … at any time.