The following is an excerpt from a Thesis by Tamara Steijger:

"Downgrading Java 5.0 Projects
An approach based on source-code
transformations"
Tamara Steijger
Oct
2008
MSI Report 08116
Växjö University ISSN 1650-2647
SE-351 95 VÄXJÖ ISRN VXU/MSI/DA/E/--08116/--SE

"...JBossRetro cannot handle anonymous implementation of abstract methods in
enumeration types... In contrast to JBossRetro Retrotranslator has no full
API support. But it can be extended easily if something is missing. It supports all Java language features as well as reflection on generics and annotations. Furthermore, it provides an enhanced version of the Java 1.4 collection framework. Especially, the support
of reflection makes Retrotranslator special".

"For projects containing reflection Retrotranslator is probably the only
solution up to now".

An interesting comparison, I think language feature support is more important the the full API, anyways Retrotranslator also includes some Java 6 API.

Cheers,

Peter.

Peter Firmstone wrote:
JBoss Retro, aparently supports the full Java 5 API, it's licensed LGPL, but that shouldn't be a problem since we only need the binary. It doesn't use ASM though.

Peter Firmstone wrote:
Patrick Wright wrote:
But, I really am not sure that if we move to a "new" VM platform, that it makes sense to say the new minimum is 1.5, when so many things in 1.5 were
fixed/corrected/enhanced in 1.6.

Some specific questions I think we need to clear up:
1) should River use 1.5 language features?
Yes


       What Java 5.0 features are supported?

   * Generics
   * Annotations
   * Reflection on generics and annotations
   * Typesafe enums
   * Autoboxing/unboxing
   * Enhanced for loop
   * Varargs
   * Covariant return types
   * Formatted output
   * Static import
   * Concurrency utilities
   * Collections framework enhancements


2) should River use 1.5 specific APIs? Any limitations?
Yes, a subset, and yes there are limitations, see comment further down.

3) should River use (any) 1.6 specific APIs?
I can't think of yet, however we can cross that bridge when we come to it.
4) should River depend on any bug fixes present in 1.6 APIs for APIs
which were already defined in 1.5?

Concerning 1) it seems the consensus is yes with no limitations. The
only language change in 1.6 that I'm aware of in 1.6 is that @Override
can be applied to methods that implement an a method defined in an
interface (thus signaling that the method in question must implement a
method defined either in a superclass or a superinterface, or else
won't compile). I suggest we can live without the @Override change for
the time being.

Concerning 2) the natural candidate is at least java.util.concurrent,
but there are other interesting APIs (see
http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html). The main
issue with APIs is that without a backport available, the classes that
depend on 1.4 won't be able to use those classes. I think we need to
settle the 1.4 compatibility issue regarding APIs, and my vote is that
we use 1.5 APIs without restrictions. If we remain compatible with
Jini 2.1 for deployment and access of services (at the level of River
infrastructure), we are covered.

This is a very valid issue, I think the best way to handle it is to not place restrictions on the use of the Java 1.5 api, but instead use the compatibility table from Retrotranslator http://retrotranslator.sourceforge.net/ as a guide and on an as needed basis submit patches to the Retrotranslator project to add functionality when it makes sense to, when it doesn't, fall back to the way one might solve the problem with Java 1.4 or if it can be justified at the time, drop support for Java 1.4. The River JRE 1.4 compatibility release should be bundled separately so we can quantify the demand once River is released.

I think that it's important to run the integration tests and the unit tests that the developer creates, against the class files compiled by Retrotranslator on JRE 1.4, as well as the main build release on Java 5, this does create an additional level of vailidation, since all tests are run twice, once againt JRE 5 with the main release classfiles and a second time with the Retrotranlator generated classfiles on JRE1.4

Maintaining compatibility with the Jini 2.1 specification, are there any reasons to break this? What about River-277: Adapt various Jini specifications/implementation to enable usage over the Internet?

What are thoughts?
Concerning 3), I think it's better for the time being if River does
not use 1.6-specific APIs, unless there are delicious candidates
listed in http://java.sun.com/javase/6/webnotes/features.html (I don't
know of any).
Well it may be justifyable if for say performance reasons or to workaround a Java 5 bug, provided that the programmer uses a try catch clause with fallback functionality, or checks the platform before executing the method. It's ugly, however it may be justifyable in some circumstances, don't want to rule it out entirely, its something that can be discussed on the list by the developer at the time.

// Comment explaining why

try{
         Something.java6Method(String s);
} catch (UnsupportedOperationException e) {
         // Do something else
}
Concerning 4), I think the reality of the current deployed base is
that we will need to write and test against 1.5 JDKs and work around
known bugs which were fixed in 1.6 and not backported.
Agree

Regards
Patrick




Reply via email to