The Perfect Flex Application Framework (Part 1 of 2)

Posted in Jon Rose on June 14th, 2009 by jonr

jonr originally posted this on Jon Rose's Blog.

In the past, I have reviewed a number of the popular frameworks commonly used with Adobe Flex (Flight, Clear Toolkit, Cairngorm, PureMVC, Mate, and Swiz).  At Gorilla Logic, we love to debate the merits of each of these frameworks and the MVC pattern in general.  As an enterprise software development shop, we love architectural things and enjoy being as geeky as possible.  Yet, we continue to be a bit confused with the industry’s over infatuation with MVC and frameworks that exist simply to enforce this pattern (or similar patterns).  So, I started down the path of contemplating what would make up the perfect Flex framework…

Over the last decade, most web frameworks in enterprise development seem to just focus on the architectural piece of the puzzle, which actually provides the least value to those tasked with building real applications.  Look at the vast majority of Java frameworks that do not even attempt to provide a built-in set of components.  Also, in the Flex ecosystem, virtually all the major third party Flex frameworks seem to exist with the primary purpose of enforcing / enabling the MVC pattern, with the notable exception of the Clear Toolkit, which provides an interesting set of enterprise features.

Flex brought on a revolution because it exists first and foremost to make developers highly productive in building cool applications.  Thus, Flex is a complete platform, and is often the only framework needed for building real applications.  It provides the pieces for building within the MVC architecture and a full set of components that meet many of the requirements found in enterprise applications.  When looking at any portion of application development, engineers should only be bringing in tools that specifically satisfy the stakeholder’s functional and non-functional requirements, or address risks specifically outlined for the project.  With the strength of the Flex platform, one should not start with the assumption that they need to add in third party frameworks.

That said, Flex does have weaknesses and can be improved upon or extended in interesting and useful ways.  Also, it can be helpful to have infrastructure that supports developers in properly separating concerns within the application code.  Frankly, if the costs of adopting a third party framework to get this infrastructure is low, then there is no reason to fight against bringing in an outside solution.  Let’s look at a few of the Flex frameworks to see how they measure up in this respect:

Cairngorm: The cost of adoption and long-term ownership is too high, with the high volume of code required for implementing even the most trivial feature, for one to seriously consider this as an option.  The leverage just is not here.
Mate: Mate addresses separation of concerns by providing developers a global event bus for handling events.  This approach fits well with the real way Flex applications are built.  Although, I tend to believe that not all events are global and likely do not all need to be externalized, but this is certainly an important piece of the puzzle.  With a reasonable technical approach to managing events, the overall cost of adopting Mate is low.
Swiz: Swiz is similar to Mate in that it has a limited surface area for developers to learn.  Its primary mechanism for separating things out is the use of dependency injection.  It is fairly elegant in its syntax and easy to use.

While two of the three outlined above are low cost to adopt, they are also limited in the number of problems they solve for a Flex developer.  That’s really what this post is about – working through where the leverage is/should/could/would be in the Perfect Flex Framework.  In part two, I make an initial attempt at providing my requirements for the perfect third-party framework.

Google Wave

Posted in Eric Daugherty on June 14th, 2009 by admin

admin originally posted this on EricDaugherty.com.

Google recently announced a new collaboration platform, and I finally got around to watching the video.

Wow.

I started watching it as a small video in the background and kept finding myself switching to full screen so I could really watch and follow what they were doing. I'm not going to attempt to summarize the 80 minute video introduction, nothing I could say would really cover it. You should spend the time and go check this out.

I will talk about some of my reactions:

First, wow. This is a solution to the fragmentation of communication. Email, IM, Twitter, Facebook, etc. There are too many channels we use to communicate, many of which are dated.

Open Platform, Open Source (mostly).

Build on GWT. HTML 5 seems to be a big focus.

RIAs - Sun, Adobe, and Microsoft are pushing their rich client platforms. Apple and Google are focused on HTML 5. This app makes a pretty strong case that HTML 5 is sufficient for nearly every app.

Playback - a cool concept that provides context that may be lost along the way. Integrates with the plugins, etc. Cool.

Convergence - Google has launched quite a few apps of varying success. Mail, Maps, Apps, Social Networking, News, Translation, etc. Wave takes these and combine them in a way that far exceeds their individual value.

Extensions - This is an extensible platform of course. Wave is cool today, but will be much more tomorrow.

Federation - This is what makes the entire concept feasible. You can have corporate wave servers but still interact with the various vendors, consultants, etc when necessary, and everything that is private never leaves your server.

Wow.

What Needs Doing

Posted in Jerry Andrews on June 14th, 2009 by admin

I have participated in more than one fiasco. A close friend (and excellent developer) friend of mine is doing so now. These are generally “successful projects” in most senses of the word, except for one key fact: they don’t deliver anything new, at a cost of several tens or even hundreds of thousands of dollars.

My personal favorite, and an instructive example, is a nine-month, 6-man replacement project for the public client of an n-tier, mission critical, customer-facing application for a very large public cash-squeezed company. I was architect for this application for several years, and I made a number of specific recommendations for it as I was leaving, including one that the client be refactored so that business logic present in the client (for good architectural reasons) was separated from the display logic. We delivered the first piece of that refactor–a display controller separate from the display code itself–and recommended that it be used for all screens, not just the ones for which we piloted it. For no reason I could understand, the architect who replaced me decided to completely replace the client–including hundreds of working screens, huge chunks of interface logic, state management code, encryption and masking code for credit-card processing, terminal interface code, etc. Knowing his management team, I’m sure the work was justified in bafflegab. The project is just wrapping up, and a cost and schedule of just 5 and 3 times (respectively) the original refactoring estimate. What problem were they trying to solve that could justify this kind of expense?
The original refactoring was proposed to address the fact that the client had become very rigid and spaghetti-bound. It was hard to understand and harder to modify, so that even small changes (and there were many of those in the queue) required weeks to make and test. All the senior developers understood that the source of the problem wasn’t the screen display code, or the hardware or server interfaces–it was the way business logic was in-lined into the screen transition code. Once that was moved out into business logic classes and properly tied into a separate screen controller, most of the problems in the client would be resolved. Such a project was difficult but was nicely bounded; we estimated a 2-man team consisting of our 2 best and most experienced developers working for 3 months could complete it. Instead it took a team of 5 working for 9 months to rewrite the entire client. Now they have a nice new front-end written in Adobe Flex–and since all the Flex coding was subcontracted, nobody on the development team can maintain the client UI. I will make a prediction: the new client will be more expensive to maintain than the old one.
I hope I’m wrong. Fortunately, I don’t work there anymore.
I see this kind of thing all the time. On my current project, a relatively junior engineer was given free reign for 3 months to refactor a chunk of functionality which runs once a year to reduce the running time from 18 hours to 3 hours. The source of the requirement was the engineer in question–not the users, not the management team. Now the code is barely readable–but it sure is fast. Of course, to make up the 3 months of developer time spent, the annual process has to run about 30 times–a process which will take between 15 and 30 years. Any changes to the process will require man-weeks of developer time to make instead of man-days. In short, there’s almost no way to justify that kind of expenditure.
So: how are these decisions made? Why do managers allow them? What could possibly justify this kind of wasted effort? And finally: why do otherwise good designers and developers allow them to happen?

Mac Window Managment

Posted in Eric Daugherty on June 13th, 2009 by admin

admin originally posted this on EricDaugherty.com.

My wife just bought a new 13" MacBook Pro, and as longtime windows users, we're both working through learning a new system. Overall she's pretty happy, but we just spent 15 minutes today figuring out an issue with windowing...

It started when I migrated over her iTunes library from her Windows box. The great thing was that not only did it work great (binary compatibility), but that it also auto-found the music (I had it on the M: drive on Windows and I moved it into her iTunes Music folder on the Mac as she has plenty of disk space).

However, the window defaulted to a size larger than her screen, and this is where the frustration started. On windows, this would be fine, as you can resize a window from any edge. However, on the Mac you can ONLY resize from the bottom right corner. You also can't move a window off the top of the screen. No matter what we tried, we couldn't get the bottom right corner on the screen to allow us to resize.

In most apps, this would probably be fine, as the green key would resize the window. However, in iTunes this button switches to the mimized player view.

After some Google searching, I figured out I could use the Option key with the green button, which finally worked. Not intuative or flexible.

Overall, she's still happy, and some learning curve is expected.

Palm Treo 755p and Exchange

Posted in Eric Daugherty on June 12th, 2009 by admin

admin originally posted this on EricDaugherty.com.

My company upgraded/migrated our Windows Domain last weekend, and as a result, my Treo 755p's ActiveSync Support stopped working. When I entered the setup information and tried to run the initial Sync, I got the error codes: 1913 4828.

There is some confusion about what this error code means. It can often be related to SSL certificate issues, which may have been part of my problem. I found this page very helpful to debug the SSL issues: http://kb.palm.com/wps/portal/kb/common/article/16733_en.html

Once I had that working (I did have to change the server name to match our certificate) I was still having issues, and I came across this post: http://episteme.arstechnica.com/eve/forums/a/tpc/f/579009962631/m/417009683931 that suggested the issue was the ActiveSync security policy. I tracked down our IT guy and cajoled him into testing out removing the policy, since ours didn't really do anything anyway. It worked! The odd thing is that the old domain seemed to have a policy as well but something must be different.

So apparently the Treo (Versamail 3.5.5) doesn't support ActiveSync with security policies. Ya, ya, time to upgrade to a real phone...

It is not your money!

Posted in Jon Rose on June 11th, 2009 by jonr

jonr originally posted this on Jon Rose's Blog.

As geeks, we love to dive head first into technical challenges, and yet, we are often less interested in learning the business domain and engrossing ourselves in solving the little peoples’ pains, you know, the users.  Focusing on them can have a number of negative effects on us, like having to write code that doesn’t challenge us, or even worse, “What if it doesn’t add anything new to my resume?”

So, we put on our senior engineer hat and plow to the front of our geek kingdom, asserting that we must develop significant long-term infrastructure in the system because it will save the company thousands, if not millions, of dollars down the road.  The infrastructure is not needed to satisfy the agreed upon use cases for this release, but it’s so important that the team would be crazy to omit the work we are proposing from this iteration.  We are so convinced of our own superior planning and genius, that we are unconcerned if no one has recognized how much pain we are saving them from yet, or that it has put the project behind schedule.  They will see some day…

Throughout the industry services are often closely identified with Service Oriented Architecture (SOA).  There is a wealth of quality architectural thinking within the SOA world.  However, there are some fundamental issues that have propagated throughout large parts of the software development industry because of the underlying philosophies found in SOA.

A central theme of the SOA development paradigm is the focus on reuse.  Software developers with even the shoddiest training have been taught to place enormous importance on reuse, where logic is modularized in a single place and used over-and-over.  So, there is nothing unusual about the SOA assertion that services should be loosely coupled and designed to support numerous clients.

A major challenge is that services in a Service Oriented architecture must also be built to support clients that have not yet been formally defined through a requirements process, or even yet conceived.  In seemingly countless instances, this has led to teams completely over emphasizing the reuse of the services being built, while immediate functional requirements are often missed, not completely supported, or in the worst cases blatantly ignored.

Pragmatic software architects recognize the considerable pain the industry has experienced from projects that over-accentuate one software tenet (reuse), while ignoring others.  Overly generic services frequently lead to extended development schedules, and in some cases they are fatal to the entire project. The blame for this trend is not SOA itself of course, but software engineers taking a good concept and overusing it until it becomes a liability.

There are absolutely cases where reuse is the chief priority for the service implementers.  A common example is creating a true, public API, such as a travel booking service developing integration endpoints for their present or future partners.  Or, for an internal IT example, consider the case where the system holding the source of customer records needs to expose the data to multiple systems throughout the organization, and a reusable service is required.  These cases are limited though.  In particular, they are most rare in IT shops, where the insanity of completely over-emphasizing reuse can be at its highest.

Quality architects avoid this trap by working with the following understanding:

  • Risks should be identified.
  • The business domain should be captured through the requirements process and implemented in its own layer.
  • The implementation should only include things that address specific project risks that have been identified or satisfy the functional requirements of the system.

Thus, the system should be built for the immediate needs, unless there is a priority placed on the future in the business requirements, or the project’s owners specifically dictate this as a priority.

Reality check: It is not your money! Building a software system should be focused on the urgent needs of the organization, unless the team is clearly directed to focus on other priorities, which is rare.

SVG Primer for Flex

Posted in Justin Shacklette on June 10th, 2009 by admin

admin originally posted this on Saturnboy.

The dream of SVG was probably born sometime in the late 90’s. Version 1.0 arrived in 2001, followed by the current version, SVG 1.1, in 2003. For anyone keeping score at home, that’s over 6 years ago, which is like 120 years ago in internet dog years. Also for those at home, SVG is a portable XML-based vector graphics format (it also does raster graphics), but you’d probably not be reading this if you didn’t already know.

Nowadays, I’m finally seeing some SVG in use. It works natively in all the real browsers (obviously not IE, which requires a plugin), and even on some mobile devices. But most importantly to me, I see it in my day-to-day work in Degrafa, and with the beta release of Flex 4, in Catalyst and FXG.

The vast majority of my experience in SVG is with paths (SVG Spec, § 8) and to a lesser extent Transforms (§ 7) and Filters (§ 15). Thankfully, these are some of the most useful and important pieces of SVG, and they all have nice one-to-one mappings to components in Degrafa and FXG.

SVG Path Primer

In SVG, a path is the outline of some object. It is described as a series of segments, where each segment can be different, either a line, curve, or arc. Path data is most often given in shorthand syntax as a series of commands followed by coordinates (we’ll ignore the long form for now). Let’s illuminate the discussion with some examples.

SVG:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
    width="200" height="200">
  <path d="M 0,0 L 100,0 L 100,100 L 0,100 z"
      fill="#EECCEE"
      stroke="#FF00FF"
      stroke-width="3" />
</svg>

Degrafa in Flex 3:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
        xmlns:mx="http://www.adobe.com/2006/mxml"
        xmlns:Degrafa="http://www.degrafa.com/2007"
        layout="absolute">
 
    <Degrafa:GeometryComposition graphicsTarget="{[cnv]}">
        <Degrafa:Path data="M 0,0 L 100,0 L 100,100 L 0,100 z">
	        <Degrafa:fill>
	            <Degrafa:SolidFill color="#EECCEE" />
	        </Degrafa:fill>
	        <Degrafa:stroke>
	            <Degrafa:SolidStroke color="#FF00FF" weight="3" />
	        </Degrafa:stroke>
        </Degrafa:Path>
    </Degrafa:GeometryComposition>
 
    <mx:Canvas id="cnv" />
</mx:Application>

MXML Graphics (aka FXG) in Flex 4:

<?xml version="1.0" encoding="utf-8"?>
<s:Application
        xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/halo">
 
    <s:Graphic>
        <s:Path data="M 0,0 L 100,0 L 100,100 L 0,100 z">
            <s:fill>
                <mx:SolidColor color="#EECCEE" />
            </s:fill>
            <s:stroke>
                <mx:SolidColorStroke color="#FF00FF" weight="3" />
            </s:stroke>
        </s:Path>
    </s:Graphic>
</s:Application>

The examples above use the shorthand path syntax to draw a 100px square that starts at the coordinate origin (0,0), which is the upper left corner in SVG and Flex. Beware the coordinate origin when translating Inkscape SVG to Flex. The other interesting thing to note is the amazing similarity between Degrafa and FXG. Who knew all my time learning Degrafa will instantly translate to Flex 4 and FXG? Awesome!

SVG Path Shorthand

Here’s a quick overview of shorthand syntax for SVG path data:


Move
M <x,y>
Move the pen to the given point.

Line
L <x,y>+
Draw a line to given point. Multiple points may be specified to draw polyline.

Horizontal Line
H <x>
Draw a horizontal line to given coordinate.

Vertical Line
V <y>
Draw a vertical line to given coordinate.

Quadratic Bezier
Q <cx,cy x,y>+
Draw a quadratic Bezier curve to given coordinate using a control point. Multiple Beziers may be specified to draw polycurve.

Cubic Bezier
C <cx1,cy1 cx2,cy2 x,y>+
Draw a cubic Bezier curve to given coordinate using two control points. Multiple Beziers may be specified to draw a polycurve.

Arc
A <rx,ry rot,lrg,swp x,y>
Draw elliptical arc to the given point.

Close
Z
Close the path.

Alas, the beta version of FXG does not support the Arc segment type, which I suspect is due to lack of support for arbitrary arcs in the underlying Flash Player rendering engine but I don’t know for sure. Thankfully, Degrafa offers full arc support (thanks Greg!). If you really need to draw arcs in FXG, for stuff like pie wedges, and are unafraid of getting into a cage match with your trigonometry textbook, you can do a good job approximating arcs with cubic Bezier curves. Alternately, you can just use Degrafa once it gets ported to Flex 4. Lastly, using uppercase for the segment type specifies absolute coordinates. This is the format commonly used by Illustrator and Inkscape when exporting drawings to SVG. One can easily switch to relative coordinates by just switching the commands to lowercase, but I would try to avoid it if at all possible as it tends to make one’s head hurt.

The Many Shapes of a Square

All of the squares above, use this shorthand data:

M 0,0 L 100,0 L 100,100 L 0,100 z

First, a Move to set the pen at the origin. Then, a Line right to (100,0), followed by a Line down to (100,100), followed by a Line left to (0,100). Then, a close (z) to return to the origin.

I can drop the commas if I want:

M 0 0 L 100 0 L 100 100 L 0 100 z

Or drop all but the first Line to make a polyline:

M 0,0 L 100,0 100,100 0,100 z

Or use Horizontal Line and Vertical Line:

M 0,0 H 100 V 100 H 0 z

Or even use relative coordinate (which makes my head hurt a little):

m 0,0 l 100,0 l 0,100 l -100,0 z
Curves

Straight lines are cool, but the real fun in life lies in the curves. Cubic Bezier curves should be very familiar to anyone who’s used a vector drawing program. Let’s replace the first segment in our square with a cubic Bezier segment. Now, the SVG shorthand becomes:

M 0,0 C 25,-25 50,25 100,0 L 100,100 L 0,100 z

When rendered, we get this:

square-funny

The shorthand command says curve to (100,0), but start out heading towards control point #1 at (25,-25) and end up coming in from control point #2 at (50,25).

Arcs

Again, let’s replace the first segment in our square with an arc segment. Now, the SVG shorthand becomes:

M 0,0 A 50,25 0 0,1 100,0 L 100,100 L 0,100 z

When rendered, we get this:

square-arc

The shorthand command says arc to (100,0), with an x-radius of 50 and a y-radius of 25, with a rotation of 0. The large-arc and sweep flags are a little confusing so you’ll want to review the SVG Spec, § 8.3.8 if you need to get down and dirty with arcs.

Conclusion

I’m a firm believer in “right tool for the job.” So, when in comes to getting SVG path data into Flex, I’m definitely going to use Illustrator or Inkscape as much as possible, and in the future I might just use Catalyst for everything. But there are a few important situations where the Flex developer absolutely must know SVG. First, if you want to do any kind of path morphing (like this), you’ll need precision control over your path segments. And second, if you want to do any dynamic path generation (like building a multi-level radial menu on the fly – which sounds like a good topic for a future post), you’ll need to manually construct your SVG paths.

Files

Podcast on FlexMonkey Testing Tool

Posted in FlexMonkey on June 9th, 2009 by jonr

jonr originally posted this on FlexMonkey :: Flex UI Testing Tool.

You can check out Stu Stern discussing FlexMonkey on a recent episode of the Speak Rich podcast from RIA Revolution. Thanks to Shashank Tiwari for interviewing Stu and covering Gorilla Logic’s favorite testing tool, FlexMonkey.  Enjoy the podcast!

Top 5 Reason’s Adobe Flex and AIR are Not For You

Posted in Jon Rose on June 8th, 2009 by jonr

jonr originally posted this on Jon Rose's Blog.

A while back I started to put together a list of cases where it might be better to avoid using Flex and/or AIR, but never posted it.  I ended up concluding that most of the issues can be addressed if Flex is a fit otherwise.  I have never been an engineer that believes that any one technology is a fit for all cases.  The other side of that coin is that I don’t believe that any platform is perfect, and you have to accept the pitfalls of whatever you choose.

Anyhow, I decided I should dust it off and put it out there.  If, for no other purpose, than to have a good reason to post the facetious list I wrote up to go with it.

Here is the list of potential issues:

  1. The iPhone:
    If you are building an application that must be available on every platform, including ones that have not been created or released yet, then targeting the Flash platform is not ideal.  That said, the notion of the platform that is portable across all types of devices and form factors comes up frequently, but in most cases it is entirely unrealistic and undesirable to build real applications with this approach.  A better approach is to build applications tailored to each specific device (or at least each genre), such as a native iPhone application with features tailored to a mobile device.

    So, in this case the iPhone is symbolic of platforms that do not support Flash and have no published roadmap for supporting 3rd party runtimes.  If you are building an application that truly has the requirement of being the same application on the desktop and every mobile device (which certainly exist), then using Flash is a no go.  In many of these cases, standard browser technologies are the default option (HTML, CSS, and JavaScript).  RIA features can be added by using frameworks like GWT.
  2. Search:
    In 2008, Adobe announced their collaboration with Google and Yahoo to make Flash content searchable.  The ability for major search engines to craw a SWF file is a nice step forward.  Yet, if you have consumer-facing content that must be searchable, then it may be best to avoid RIA features in general (not just Flex).  The search paradigm is heavily dependant on the page-based model.  It is a major challenge to build rich applications that can be entered from any direction and properly reconstitute their state.
  3. Low Bandwidth Clients:
    If you are building a system that potentially services a large volume of low bandwidth users, then Flex can present some challenges.  The compiled applications are typically quite sizeable.  Flex does allow for breaking up the applications with runtime-shared-libraries (RSL’s).  With that approach, the Flex SDK still has to be downloaded (just not over-and-over).  So, trying to using Flex in this case is a bit of a stretch.

    AIR can actually present some real opportunities with offline clients.  For example, Parleys.com has reported that low-bandwidth clients love their application because it can download videos overnight for viewing offline.
  4. Content Centric Applications
    There is a class of content centric applications that fit the hyperlink paradigm and should never be made into RIAs, such as Wikipedia and Craigslist.  Certainly, there are a number of applications that combine heavy content along with the need for a number of advanced RIA features.  In those cases, Flex / Flash has presented real challenges because of its limited ability to deal with large bodies of text.  Many of these limitations are being addressed with the next version of Flex and the recent release of Flash Player 10.
  5. Local Device Access:
    Adobe AIR makes a compelling case for building desktop applications with web technologies, but if you are building an application that requires local device access then it is worth considering more traditional desktop platforms that offer a greater level of access to machine resources.  The community has responded to this concern with the Merapi project, but for those looking for major vendor support this is still a valid concern.
Now, the facetious list that highlights a number of reasons one might settle on not using the Flex / Flash platform:
  1. You prefer not to have a full featured easily extensible set of components.
  2. You like spending time debugging your Ajax applications in all the different browsers and versions.
  3. You are a Java developer and too afraid to shell out $250 for an IDE.
  4. You believe that you can do anything you ever wanted to do in Perl.
  5. You like working in a 10 year old standard (HTML 4).
  6. You like the term Open Web, and believe it actually exists.
  7. You hate quality applications, your clients, and yourself.

Let me know if you have any additions for either list!

Java Email Server 2.0 Beta 1 Released

Posted in Eric Daugherty on June 7th, 2009 by admin

admin originally posted this on EricDaugherty.com.

There have been multiple efforts started over time to create a modernized version of JES (It is an 8 year old fork of an even older project) that would incorporate features more or less expected from a up-to-date MTA/MDA. I'm happy to announce that Andreas Kyrmegalos has stepped forward and developed a heavily revised and augmented version of Java Email Server that will be released as 2.0 Beta 1. Staying true to a gui-less configuration approach hasn't prevented a host of new features to be introduced.

While the changes are too numerous to cover in this announcement, I wanted to highlight a few of the more important changes:
  • TLS/SSL Support
  • Configurable sandboxing
  • Support for white/blacklisting
  • Support for spam filtering/virus checking via amavisd-new using a dual MTA approach
  • Data directories are now configurable (incoming/outgoing email storage)
  • New Service Wrapper (Tanuki Java Service Wrapper)
  • More efficient mail dispatching to multiple users at a single domain
  • Cleaner shutdown process
  • Mail transactions with mail servers employing reverseDNS checks (useful for JES instances on a dynamic IP)
  • More efficient memory handling
  • On the fly POP3/SMTP port listening switching
  • Interfaces to enable extension modules
  • Migration tool for JES 1.6.1
  • Introduction of an automated testing framework
  • Improved MIME header parsing support
  • 8BITMIME, SIZE extensions support
  • SASL MD5-DIGEST, GSS-API support
  • and MUCH MUCH more.
JES is now dependent on JDK 1.5. The existing 1.6.x branch will continue to be available to support JDK 1.4.

Project management is being carried out using Maven.

JES is also getting a new license. The existing GPL license was due to the original GPL license of CRSMail. CRSMail has now been released into the public domain, allowing JES to be re-licensed under a BSD Style license.

I am also launching a new Google Group to facilitate a more open support structure. Please post all questions about JES to this group.

This initial release is a Beta. It has been used in production environments, tested under Windows XP, Ubuntu and Windows Vista on single and multi core systems and should be solid, but it is possible that some issues may exist with specific configurations/environments. I encourage everyone to give this a try and provide feedback. The goal of this version is to provide a much needed step forward for JES while retaining the simplicity and ease of configuration and deployment. Let us know if this release achieves the goal.

The 2.0 Beta 1 release is available to download from the JES Home Page and a version 2 branch resides at sourceforge's subversion repository. Give it a spin and post your comments in the Google Group.