<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>Graham Hamilton&apos;s Blog</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/" />
<modified>2006-05-23T15:36:41Z</modified>
<tagline></tagline>
<id>tag:weblogs.java.net,2008:/blog/kgh/159</id>
<generator url="http://www.movabletype.org/" version="3.01D">Movable Type</generator>
<copyright>Copyright (c) 2006, kgh</copyright>
<entry>
<title>Slides for JavaOne 2006 Technical Keynote</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2006/05/slides_for_java_2.html" />
<modified>2006-05-23T15:36:41Z</modified>
<issued>2006-05-17T22:32:35Z</issued>
<id>tag:weblogs.java.net,2006:/blog/kgh/159.4804</id>
<created>2006-05-17T22:32:35Z</created>
<summary type="text/plain">Here are the slides for the JavaOne 2006 Technical Keynote.  
These cover the high-level roadmaps for Java SE and EE, 
including Java SE 6 (Mustang), the Now and How of Java EE 5,
plus future directions.  Please feel free to reuse them!</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>
<dc:subject>JavaOne</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<script src="http://weblogs.java.net/blog/kgh/archive/buttons.js" type="text/javascript"></script>
<p>
Here are the slides Bill Shannon and I used for the JavaOne 2006 
Technical Keynote.  These cover the high-level roadmaps for Java SE
and EE, including Java SE 6 (Mustang), the Now and How of Java EE 5,
plus future directions.
</p>
<p>
Among the future directions were some of the initial ideas for Java SE 7 (Dolphin) and 
new language technologies including Visual Basic for the Java Platform (Project
Semplice) and JavaScript in the Java EE Web-Tier (Project Phobos).
</p>
<ul>
<li><p>
<a href="http://weblogs.java.net/blog/kgh/archive/TK.2006.pdf">Tech Keynote (PDF)</a> (1.4 meg)
</p><li><p>
<a href="http://weblogs.java.net/blog/kgh/archive/TK.2006.sxi">Tech Keynote (StarOffice)</a> (1.7 meg)
</p><li><p>
<a href="http://weblogs.java.net/blog/kgh/archive/TK.2006.ppt">Tech Keynote (PowerPoint)</a> (2.5 meg)
</p>
</ul>
<p>
Please feel free to reuse these slides to spread the Java Platform
news.
</p><p>
What the slides can't show is the various fine demos:
<ul>
<li><p>
<a href=http://weblogs.java.net/blog/chet/>Chet Haase</a>
showed Mustang desktop integration features, including the
Vista look-and-feel, splash screen support, icons in the system tray,
and launching native apps.
</p><li><p>
<a href=http://weblogs.java.net/blog/ludo/>
Ludovic Champenois</a> showed Java EE 5 in action, including building
a Web Service in 
<a href=http://www.netbeans.org/community/releases/55/>NetBeans 5.5</a>;
building a transactional web service
with 
<a href=http://en.wikipedia.org/wiki/Vi>vi</a> and javac; and finally building a Java EE 5 app with Java
Persistence, again in NetBeans 5.5.
</p><li><p>
<a href=http://blogs.sun.com/tor>
Tor Norbye</a> showed the Visual Basic language support from Project Semplice, 
using Java Studio Creator to build a JSF web application using VB code
for its application logic.  For more on Semplice, see
<a href=http://blogs.sun.com/roller/page/tor/20060522>Tor's blog</a>.
</p><li><p>
<a href= http://weblogs.java.net/blog/robc/>Roberto Chinnici</a> showed off
<a href=https://phobos.dev.java.net/>Project Phobos</a>, using JavaScript within the
Java web-tier to implement a rich Web 2.0 application, with Ajax on the
client calling to JavaScript pages and servlets running on
<a href=http://glassfish.dev.java.net>Glassfish</a>.  For
more on Phobos, see 
<a href=http://weblogs.java.net/blog/robc/archive/2006/05/introducing_pro.html>Roberto's blog</a>.
</p>
</ul>

<p>
Also, if you're interested, a video replay of the session is available (in three segments) on the
<a href=http://java.sun.com/javaone/sf/sessions/general/index.jsp>
JavaOne Tuesday General Sessions</a> page.
</p>

<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>

</table>

<!-- Start of StatCounter Code -->
<script type="text/javascript" language="javascript">
var sc_project=1309583; 
var sc_invisible=1; 
var sc_partition=11; 
var sc_security="25945d68";  
</script>

<script type="text/javascript" language="javascript" 
    src="http://weblogs.java.net/blog/kgh/archive/counter.js">
</script>
<noscript><a href="http://www.statcounter.com/" target="_blank"><img  src="http://c12.statcounter.com/counter.php?sc_project=1309583&java=0&security=25945d68&invisible=1" alt="hit counter" border="0"></a> </noscript>

<!-- End of StatCounter Code -->]]>

</content>
</entry>
<entry>
<title>Hurtling Towards JavaOne...</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2006/05/hurtling_toward.html" />
<modified>2006-05-07T02:02:19Z</modified>
<issued>2006-05-05T17:13:23Z</issued>
<id>tag:weblogs.java.net,2006:/blog/kgh/159.4663</id>
<created>2006-05-05T17:13:23Z</created>
<summary type="text/plain">I&apos;m in my normal ten-days-to-JavaOne panic phase, but the various
pieces are starting to come together...</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>
<dc:subject>Community</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<script src="http://weblogs.java.net/blog/kgh/archive/buttons.js" type="text/javascript"></script>
<p>
I'm in my normal ten-days-to-JavaOne panic phase, but the various
pieces are starting to come together.
</p><p>
<a href=http://java.sun.com/javaone/sf/sessions/general/bios.jsp#bshannon>Bill
Shannon</a> are I are finalizing the slides for the
<a href=http://java.sun.com/javaone/sf/>JavaOne 2006</a>
<a href=http://java.sun.com/javaone/sf/sessions/general/index.jsp>
Technical General Session</a> at 12:15 on Tuesday the 16th.
This is the session where we provide the overall roadmaps
for the Java SE and EE platforms, to try to give people a context
for the many individual technical sessions and BOFs that follow.
</p><p>
As usual we're panicking over having far too much material for the
available time.  We'll be
covering Mustang and Java EE 5, but we'll also have a section towards
the end looking forward to Dolphin and other new technologies.
This year we're including a range of demos, so you can see the
reality, both of the "Now and How" for Java EE 5 and for some of
the future ideas.  So grab your box lunch and bring it into the
keynote room for our 12:15 start!
</p><p>
The program of general sessions start with the Tuesday morning Sun 
executive keynote with <a href=http://java.sun.com/javaone/sf/sessions/general/index.jsp>
Jonathan Schwartz and Jeff Jackson</a>.
The Thursday morning keynote from
<a href=http://java.sun.com/javaone/sf/sessions/general/day3.jsp>Erich
Gamma and John Wiegand</a> of IBM
should be particularly interesting: it promises many insights
from their Eclipse experiences.  And on Friday,
<a href=http://java.sun.com/javaone/sf/sessions/general/day4.jsp>Scott
and James</a> will show
us the latest, greatest, craziest, most fun Java innovations!
</p><p>
There are, of course, a vast range of
<a href=http://java.sun.com/javaone/sf/sessions.jsp>Technical
Sessions and BOFs</a> covering all kinds of key Java technologies.
but, in addition to the sessions and BOFs, I wanted to plug a few
associated community events:
</p>
<ul>
<li><p>
<a href=http://mustang.dev.java.net>Mustang Community</a>
party, at the Argent Hotel, Tuesday, May 16, 8:30pm.  Come here if 
you are contributing, or would like to contribute to Mustang and Dolphin.
</p>
<li><p>
<a href=http://glassfish.dev.java.net>Glassfish Community</a>
JUG and Reception, at the Argent Hotel, Wednesday, May 17, 5-7 pm, for participants
and users of Sun's open source Java EE 5 project.
</p>
<li><p>
<a href=http://jcp.org/info/event>Java Community Process Reception</a>
at the Argent Hotel, Wednesday, May 17, 6:30-8:00 pm, for JCP participants.
</p>
</ul>
<p>
Now I have to run -
<a href=http://weblogs.java.net/blog/chet>Chet</a> has just got me
some new benchmark data to expose (!) concrete numbers for the 
benefits of the famous
<a href=http://weblogs.java.net/blog/chet/archive/2005/04/swing_update_no_1.html>Gray
Rect</a> UI fix...

</p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>

<!-- Start of StatCounter Code -->
<script type="text/javascript" language="javascript">
var sc_project=1309583; 
var sc_invisible=1; 
var sc_partition=11; 
var sc_security="25945d68";  
</script>

<script type="text/javascript" language="javascript" 
    src="http://weblogs.java.net/blog/kgh/archive/counter.js">
</script>
<noscript><a href="http://www.statcounter.com/" target="_blank"><img  src="http://c12.statcounter.com/counter.php?sc_project=1309583&java=0&security=25945d68&invisible=1" alt="hit counter" border="0"></a> </noscript>

<!-- End of StatCounter Code -->]]>

</content>
</entry>
<entry>
<title>AOP: Madness and Sanity</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2006/03/aop_madness_and.html" />
<modified>2006-03-08T19:50:18Z</modified>
<issued>2006-03-08T19:50:10Z</issued>
<id>tag:weblogs.java.net,2006:/blog/kgh/159.4268</id>
<created>2006-03-08T19:50:10Z</created>
<summary type="text/plain">The much-abused term &quot;AOP&quot; covers a wide range of uses, some
of them eminently sane and some of them eminently crazy.  Here
are some comments on both the good and the bad.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>
<dc:subject>J2SE</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<script src="http://weblogs.java.net/blog/kgh/archive/buttons.js" type="text/javascript"></script>
<p>
When people ask me "what do you think of AOP?",  I tend
to flinch, because the term AOP has come to be used to cover a 
very wide range of different uses, some of which I think are
Totally Wonderful and some of which I think are Thoroughly Bad
Ideas.  Here's a brief survey of the range and of my reactions.
</p>
<p><b>Quick Overview of AOP</b></p>
<P>
The core concept of Aspect Oriented Programming is that there are
common issues that apply across a range of otherwise unrelated
classes. In AOP, these common issues are often referred to as &quot;cross
cutting&quot; concerns because they cut across the normal inheritance
class structure. The goal of AOP is to allow cross cutting concerns
to be addressed by applying some common logic (or &quot;aspects&quot;)
to a set of classes, without having to individually modify the source
code for each class. 
</P><P>
The idea of wrapping extra functionality around target classes will
be very familiar to Java EE developers. Java EE containers typically
add extra functionality and semantics to target classes by intercepting
incoming calls to target objects. For example, an EJB container can add
transactional semantics to a target class.
(Yes, J2EE has been using AOP all along!)
</p>
<p><b>Java Language Principles</b></p>
<P>
The Java language has been designed and evolved with certain
specific underlying principles in mind.
</P><P>
We have put great emphasis on source code readability. As far as
possible we have tried to follow the principle that &quot;what you
get is what you see&quot;. We have worked to maintain a clear and
consistent base semantic model and to avoid language constructs that
might undermine source code readability. 
People should be able to quickly read Java source code and then
reliably understand what that Java source code does. That meaning
should be independent of the particular compilers, tools, or runtime
environments that are used. 
</P><P>
Now, we aren't ivory tower philosophers. We want a Java language
that is productive for writing
and maintaining large applications. So there will always be a trade-off
between principles and pragmatics. However, in looking at the success
and popularity of the Java language, much of it
does seem to derive from these core principles. They seem
to have worked well and to be worth maintaining and protecting. 
</P>
<p><b>The Good: Container Based AOP</b></p>
<P>
One use of AOP is based on running objects within containers.
These objects can only be accessed via their container. The container
can intercept incoming calls and add additional semantics. An example
of this approach is the way that Java EE containers can add
transactional semantics to EJB components by intercepting incoming
calls. 
</P><P>
In general this use of AOP seems fairly benign. The source code
within the target objects is all behaving exactly as a developer
should expect. Developers do need to be aware that they are accessing
the objects indirectly and that the container may perform extra
tasks.  However the idea of operating through a level of indirection
is a fairly normal Java concept.
</P><P>
Now, within this general use case, there are probably a range of
good and bad uses.  Uses of container intervention such as
adding transactional semantics in EJB, or adding logging,
or adding extra security checks seem very reasonable.
</p>
<p><b>The Bad: Modifying Language Semantics</b></p>
<P>
Some uses of AOP rely on using runtime mechanisms to modify
semantics that are specified by the Java Language Specification
(JLS). For example, side files might specify that various
modifications are to be made to target classes to invoke additional
code when various operations are performed. Some uses of AOP allow
extra code to be invoked when fields are accessed or when methods are
called. 
</P><P>
The JLS carefully specifies the precise semantics of the Java
language. For example, it precisely specifies the behavior that
occurs when fields are accessed and it precisely specifies the rules
by which one method may call another, including the cases when the
call may proceed through other code as well as the cases when it must
proceed directly from caller to callee.
Developers should be able to rely on these semantics when they are
reading source code.
</P><P>
To take an extreme example, if a developer has written a statement
&quot;</tt>a = b;</tt>&quot; then they should be able to
rely on the value of the field &quot;<tt>b</tt>&quot; being
assigned to the field &quot;<tt>a</tt>&quot;,
with no side effects. Some AOP toolkits allow arbitrary extra
code to be executed when this statement runs, so that there can be
arbitrary extra side effects as part of this assignment or even so
that an arbitrary different value may be assigned 
to &quot;<tt>a</tt>&quot;.  Yikes!
Similarly, some uses of AOP permit extra code to be inserted on a
method call from one method to another, even when the JLS clearly
specifies that that method call will occur directly. This enables
arbitrary extra code to be executed, with potentially arbitrary side
effects, in situations where a Java developer should expect there
will be no side effects. 
</P><P>
This is the kind of arbitrary intervention that I think quickly
races across the boundary line to insanity.  (And I think most
serious AOP proponents would agree.)  I don't want the fundamental
behavior of a chunk of source code being changed by someone magically
reaching in and changing the code's meaning from the outside.  That
seems like a really bad idea!
 </P><P>
The core problem with these approaches is that if someone relies on
techniques like these in writing their code, then other developers
will no longer be able to understand that source code, because it
has been developed to rely on side effects that are both at odds with
the Java language definition and which are magically applied from
somewhere outside the source file.  You should not need to have global
knowledge of a whole environment in order to understand some local
fragments of code.
</P><P>
Overall, using AOP to modify the meaning of the Java language
seems like a really bad way to go.
</p>
<p><b>The New: Java Language Annotations</b></p>
<P>
In J2SE 5.0, the concept of <EM>annotations</EM> was added to the
Java language. In many ways, annotations were designed to meet
similar goals to AOP. The concept of annotations is that developers
may apply special markers to target method, fields, or classes in
order to designate that they should be processed specially by tools
and/or runtime libraries. 
</P><P>
Now, annotations are not allowed to modify the behavior defined
in the Java Language Specification. Within a source file that contains
annotations, at runtime all the source code must execute exactly as 
defined by the JLS.  That was a deliberate choice - we don't want
annotations to become a way of defining arbitrary magic behavior within
normal Java code.  However, the annotations may cause changes to the
overall behavior of the program, for example by directing a container
to apply special behavior when forwarding calls into a target class.
</P><P>
For me, one big benefit of annotations over classic AOP
is that annotations
are clearly visible in source code.  So if you are reading an
application you can clearly see which specific annotations are 
affecting the code.  That readability advantage normally
seems to outweigh the AOP advantage of being able to apply new
semantics silently without modifying the affected class. 
</P><P>
My sense is that many use cases that were initially considered for
use with AOP can now be better solved by the use of annotations.
That is part of what is happening with the extensive use of
annotations in 
<a href=http://java.sun.com/javaee/5/index.jsp>Java EE 5</a>.
</p>
<p><b>Conclusion</b></p>
<P>
The use of container based AOP seems to provide a reasonable
mechanism for supporting AOP "cross cutting concerns" within
Java environments, without breaking developers' expectations of
how Java source code behaves.  Similarly, Java language annotations
appear to provide a convenient mechanism for supporting some of
the use cases originally targeted by AOP. 
</P><P>
However, I think AOP quickly drifts from good to evil when it
starts being used to mutate the meaning of source code or to
otherwise modify what people can and should expect from Java 
source code.
</P><P>
So, yes, I am a fan of AOP.  But of a sane, restrained AOP!
</p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>

<!-- Start of StatCounter Code -->
<script type="text/javascript" language="javascript">
var sc_project=1309583; 
var sc_invisible=1; 
var sc_partition=11; 
var sc_security="25945d68";  
</script>

<script type="text/javascript" language="javascript" 
    src="http://weblogs.java.net/blog/kgh/archive/counter.js">
</script>
<noscript><a href="http://www.statcounter.com/" target="_blank"><img  src="http://c12.statcounter.com/counter.php?sc_project=1309583&java=0&security=25945d68&invisible=1" alt="hit counter" border="0"></a> </noscript>

<!-- End of StatCounter Code -->]]>

</content>
</entry>
<entry>
<title>Raving about Java EE 5</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2006/02/raving_about_ja.html" />
<modified>2006-02-21T17:52:41Z</modified>
<issued>2006-02-21T17:52:32Z</issued>
<id>tag:weblogs.java.net,2006:/blog/kgh/159.4163</id>
<created>2006-02-21T17:52:32Z</created>
<summary type="text/plain">Java EE 5 went into Beta today. I think Java EE 5 will be
by far the biggest developer event of 2006.  Here&apos;s why.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>
<dc:subject>J2EE</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<script src="http://weblogs.java.net/blog/kgh/archive/buttons.js" type="text/javascript"></script>
<p>
<a href=http://java.sun.com/javaee/5/index.jsp>
Java EE 5</a> went into 
<a href=http://java.sun.com/javaee/5/downloads/>Beta</a>
 today.  I've been raving at people
inside of Sun about how important 
this is.  I think Java EE 5 will be by far the biggest developer
event of 2006.  I love what we've accomplished in Tiger and Mustang,
but Java EE 5 brings a much deeper and more important set of changes:

</p>
<ul>
<li><p>
Java EE 5 is a major revamp of the Java enterprise developer programming
model.  It radically simplifies Java EE development, especially for
Web Services (JAX-WS 2.0) and
transactional components (EJB 3.0).  And it
also brings a new simplified database persistence model 
("Java Persistence").

</p>
<li><p>
J2SE 5.0 (Tiger) was a big deal and a great release. But for me
its most important feature was the Java language "annotations" work.
That work was specifically  intended to enable radical
Ease-of-Development changes in Java EE.  Now we're delivering those
changes in Java EE 5 and it seems to be working: code that used
to be convoluted  and awkward in J2EE 1.4 is now dramatically 
simplified in Java EE 5.
</p>
<li><p>
It's all about making developers productive.  We want to reduce the
amount of time you need to spend worrying about the Java EE plumbing
and thus increase the amount of time you can spend on your real
application logic.
</p>
</ul>
<p>
If you've been tracking J2EE, then you probably know that J2EE has 
pretty consistently conquered the high ground on functionality, stability, 
scalability, performance, flexibility, deployment, support and many
other topics.   So given all this abundance of riches, why do we
need to do a major upgrade?
</p><p>
Well, in stepping back and surveying J2EE 1.4, we realized that
the power, richness and flexibility had come with a significant
price tag.  You can do anything in J2EE, but doing common
tasks can involve a lot of boilerplate and a lot of unnecessary
concepts.   We allow lots of options, which is good: but we often
require you to specify lots of options for even simple cases,
which is bad.
</p><p>
My very favorite
ugliness (of which I am one of the prime perpetrators!) is the
boilerplate for getting an EJB reference:
</p>
<pre><tt>    Context initial = new InitialContext();
    Context myEnv = (Context)initial.lookup("java:comp/env");
    Object objref = myEnv.lookup("ejb/SimpleConverter");
    ConverterHome home = (ConverterHome) PortableRemoteObject.narrow(
                               objref, ConverterHome.class);
    Converter currencyConverter = home.create();
</tt></pre>
<p>
Yikes!  What <em>is</em> all that code doing?
Two casts and a <tt>PortableRemoteObject.narrow</tt> ?
</p><p>
So we realized that the big challenge was to greatly simplify the 
Java EE development model so that developers could use the power
of Java EE, but avoid the complexity and the boilerplate.  This was
a key motivation behind a major Ease-of-Development initiative
that we ran  across J2SE 5.0 and Java EE 5.
</p><p>
For Java EE 5 we had some wide ranging goals:
</p><ul>
<li><p>Eliminate common boilerplate.  If millions of developers need to
  type something, it had better be both useful and necessary.</p>
<li><p>Focus in on "Plain Old Java Objects" (POJOs).  In particular, 
  get rid of unnecessary interfaces and class hierarchy clutter.</p>
<li><p>Improve defaults, so that the 90% common cases "just work".</p>
<li><p>Eliminate the need for deployment descriptors.  (But still allow
    people to add them later.)</p>
<li><p>Emphasize "truth-in-source-code" so that source code clearly specifies
  what is going on.  For example, you shouldn't need to read an
  XML side file to understand what some code is doing.</p>

</ul>
<p>
All of this while still offering full binary and source compatibility.
And while <em>also</em> still allowing people to use all the fancy
bells and whistles when they need them.  Including the full glories
of deployment descriptors!
</p><p>
One of the key early decisions was to move to a more declarative
programming model.  Rather than requiring that people programmatically
code up behavior, we wanted to allow people to specify behavior
in some kind of declarative style, so that tools and libraries
could recognize your intent and take care of the programmatic
actions for you.  But at the same time we wanted to ge away from
complex XML side files or obscure naming patterns as the way
of specifying behavior.  We wanted to allow both simple declarative
coding and also return to an emphasis on truth-in-source-code.
</p><p>
These various factor led to the decision to develop a new
Java language feature <em>annotations</em> that would allow API
designers to create targeted annotation types and then allow developers
to easily use those annotation types to declaratively specify behavior,
which will then be implemented by tools and libraries.
</p><p>
To illustrate this, let's look at how my earlier six lines of EJB
reference code from J2EE 1.4 would appear in Java EE 5:
</p>
<pre><tt>    @EJB Converter currencyConverter;
</tt></pre>
<p>
That's it.  We are now using the <tt>@EJB</tt> annotation to
declaratively specify that the field "currencyConverter" should
be initialized to contain a reference to a Converter EJB, obtained
from the default provider.  When the Java EE container initializes
our object it will use this information to fill in the field for us.
Ha!
</p><p>
Annotations have been a big win.  They are succeeding in allowing
major simplifications of both the Web Services model (JAX-WS)
and the core EJB model.  To show that, let's start with a minimal
Plain Old Java Object:
</p>
<pre><tt>    public class Hello {
        public String sayHello(String param) {
            return “Hello “ + param;
        }
    }
</tt></pre>
<p>
Now let's turn it into a Web Service, by adding an <tt>@WebService</tt>
annotation:
</p>
<pre><tt>    import javax.jws.WebService;

    @WebService 
    public class Hello {
        public String sayHello(String param) {
            return “Hello “ + param;
        }
    }
</tt></pre>
<p>
Gee, that was easy.  Now let's make it into an EJB.
In this case we'll make it a stateless session bean by using
the <tt>@Stateless</tt> annotation:
</p>
<pre><tt>    import javax.jws.WebService;
    import javax.ejb.Stateless;

    @WebService
    @Stateless
    public class Hello {
        public String sayHello(String param) {
            return “Hello “ + param;
        }
    }
</tt></pre>
<p>
I love annotations.  They change everything.  Yes, as Java developers
we do need to learn the new annotation lifestyle.  When we read code we
need to watch out for use of annotations and understand what that will 
mean.  But the annotations are there in the source code, they are readable,
and they sure simplify a lot of tasks.
</p><p>
As well as simplifying Web Service creation and EJBs, annotations 
also support the new and greatly simplified Java Persistence Model,
which provides a lightweight Object-Relational Mapping for mapping
between in-memory Java objects and on-disk database tables.
(Java Persistence is being delivered as part of Java EE 5, but 
it will also be made available as an add-on for use with Java SE.)
</p><p>
There is a lot more in Java EE 5, including JSP 2.1, Servlets 2.5,
JSF 1.2, JAXB 2.0, JAX-WS 2.0, StAX, and many smaller spec updates.
There has been a lot of great work here, based on cooperation
from many individuals across a wide range of companies working
together through the JCP.
</p><p>
The official 
<a href=http://java.sun.com/javaee/5/downloads/>
Java EE 5 Beta Bits</a> are available at
<a href=http://java.sun.com/javaee/5/downloads/>
java.sun.com/javaee/5/downloads</a>.
However, bear in mind that the Reference Implementation
for Java EE 5 is being developed in open source at the
<a href=http://glassfish.dev.java.net>GlassFish Project</a>
and you can see the raw development and get the regular nightly builds there.
And if you want, you can 
<a href=http://glassfish.dev.java.net/public/devindex.html>
participate</a> in building it!
</p><p>
For more on the Java EE 5 Beta, check out some of the other 
Java EE 5 blogs an
<a href=http://blogs.sun.com/roller/page/theaquarium>The Aquarium</a>.
</p><p>
2006 looks like being a good year for Java.  
<a href=http://mustang.dev.java.net>Mustang</a> looks like being
a great update for Java SE - we went to 
<a href=http://java.sun.com/javase/6/>Mustang Beta</a> last week and we've already
had a lot of positive responses from the
<a href=http://mustang.dev.java.net>Mustang early access snapshots</a>.
But 
<a href=http://java.sun.com/javaee/5/downloads/>
Java EE 5</a> looks like it is on track to
be the really Big Winner.
</p><p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>

<!-- Start of StatCounter Code -->
<script type="text/javascript" language="javascript">
var sc_project=1309583; 
var sc_invisible=1; 
var sc_partition=11; 
var sc_security="25945d68";  
</script>

<script type="text/javascript" language="javascript" 
    src="http://weblogs.java.net/blog/kgh/archive/counter.js">
</script>
<noscript><a href="http://www.statcounter.com/" target="_blank"><img  src="http://c12.statcounter.com/counter.php?sc_project=1309583&java=0&security=25945d68&invisible=1" alt="hit counter" border="0"></a> </noscript>

<!-- End of StatCounter Code -->]]>

</content>
</entry>
<entry>
<title>I&apos;m Looking for some Java Boilerplate</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2005/11/im_looking_for.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-11-15T14:18:17Z</issued>
<id>tag:weblogs.java.net,2005:/blog/kgh/159.3633</id>
<created>2005-11-15T14:18:17Z</created>
<summary type="text/plain">We want to simplify development in the Java platform.  I&apos;d like
to find the next set of Java boilerplate that we ought to go after.
Your suggestions appreciated!</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<script src="http://weblogs.java.net/blog/kgh/archive/buttons.js" type="text/javascript"></script>
<p>
We know we have a lot of power in the Java platform, but sometimes
that power has come at a cost in simplicity.  We want to improve that,
and Ease-of-Development has been a major focus of Tiger, Mustang and
Java EE 5.
Sometimes we need to add major new features to simplify life 
for developers but often the problem isn't that there
is missing functionality, but that the existing functionality is
cumbersome to use, or requires typing unnecessary boilerplate code.
</p><p>
To give you a sense of the kinds of things I'm talking about, see
<a href=http://weblogs.java.net/blog/kgh/archive/2005/11/my_favorite_dea.html>
My Favorite (Dead) Java Boilerplate</a>.  That gives five examples
of removing rough edges and simplifying common tasks.
</p><p>
We've accomplished a lot already, specially in Tiger and in Java EE 5.
But I think there is still more to do and I am looking for the next
set of things we ought to try to simplify or eliminate.
</p><p>
You can help.  What are your favorite Java annoyances?  I'm 
particularly looking for areas where people regularly have to type
in awkward or redundant code that ought to be eliminated.  In this
context, I am mostly <em>not</em> looking for big language changes
or major framework proposals.  (We tend to do quite enough of that already!)
I'm hunting for the smaller polishings that often get overlooked.
</p><p>
(Many thanks to people who've already posted suggestions!)
</p><p>
If you have other suggestions, send an email describing the problem to
java-boilerplate<em>@</em>sun.com.  We probably won't be able to respond
to individual suggestions, but we will read all the proposals carefully.
Note: you don't need to provide a solution.  If we can clearly identify
the problems we have a large toolbag to attack them with.
</p><p>
This is your chance to help get your favorite rough edges fixed!
</p><p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>]]>

</content>
</entry>
<entry>
<title>My Favorite (Dead) Java Boilerplate</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2005/11/my_favorite_dea.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-11-14T00:03:20Z</issued>
<id>tag:weblogs.java.net,2005:/blog/kgh/159.3622</id>
<created>2005-11-14T00:03:20Z</created>
<summary type="text/plain">As part of both Java SE and Java EE, we have been working
to simplify common tasks.  Here are my five favorite examples
of how we are eliminating common boilerplate.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>
<dc:subject>J2SE</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<script src="http://weblogs.java.net/blog/kgh/archive/buttons.js" type="text/javascript"></script>
<p>
In the Java platform we have tended to focus on adding lots of
power and flexibility.  That's great, but sometimes that power
and flexibility can get in the way of doing common tasks.  As
part of the Ease-of-Development initiative we have been focusing
on simplifying common tasks and getting rid of unnecessary
boilerplate code.
</p>
<p>
Here are my five of my favorite cleanups so far:
</p>
<p>
<b>#1: Opening a Text File</b>
</p><p>
In JDK 1.1 to 1.4, in order to open a simple text output file
you needed to do:
<pre><tt>    FileWriter fout = new FileWriter("fred.txt");
    BufferedWriter bout = new BufferedWriter(fout);
    PrintWriter pout = new PrintWriter(bout);
</pre></tt>
</p><p>
Say what?  Why are we having to type three "<tt>new</tt>"s in order
to do what should be a simple operation?
</p><p>
In Tiger we have finally added direct support for the common case
and now you can do:
<pre><tt>    PrintWriter pout = new PrintWriter("fred.txt");
</pre></tt>
</p><p>
This is an interesting example of a common glitch in our thinking.
In the Java platform we often like to provide lots of well designed,
well separated components that can be plugged together in interesting
ways.  In fact some people might argue be that the design is cleaner
if the PrintWriter class doesn't know anything about files.  Well,
personally, I don't think so.  I think it is good to provide clean,
well separated components, but we <b>also</b> need to provide simple
shortcuts to support the most common use cases.
</p>
<p>

<b>#2: Avoiding the Content Pane Pain</b>
</p>
<p>

In JDK 1.1 to 1.4, if you wanted to add a Swing GUI component to
a container you simply said <tt>container.add(component)</tt>.
Well, yes, except that if the container happened to be a JFrame
you would get a helpful runtime exception saying that you ought
to be saying
<pre><tt>    frame.getContentPane().add(component);
</pre></tt>
</p><p>
Umm, say what?  Rather than raising the exception, couldn't the
<tt>JFrame.add</tt> method itself call <tt>JFrame.getContentPane().add()</tt>?
Yes it could.  And in Tiger it does.  Now you can just call <tt>add</tt>,
 as you would with any other container object.
<pre><tt>    frame.add(component);
</pre></tt>
</p><p>
This only saves a few keystrokes, so is this really a big deal?
Yes.  The real saving is that you can avoid having to learn
a whole new unnecessary concept.   The reason that the
<tt>JFrame.add</tt> method originally threw an exception was because
<tt>JFrames</tt> actually support three different panes (<tt>content</tt>,
<tt>glass</tt> and <tt>root</tt>),
and it was
considered important to educate developers about those choices.
Well, I've written various Swing applications over the
years and I've never actually found the need to exploit the various
different panes.   The old behavior of <tt>JFrame.add</tt>
forced me to go away and learn about panes.  And that was
distracting and unhelpful.  The lesson here is that (once again)
it is normally better to provide simple sensible defaults and to
avoid forcing people to learn about complex options.
</p>
<p>

<b>#3: Self Registering JDBC Drivers</b>
</p>
<p>
Since JDK 1.1, in order to load a JDBC driver, you needed to do:
<pre><tt>    Class.forName("com.fred.FredDriver");
    Connection con = DriverManager.getConnection("jdbc:fred:fredsite.com");
</pre></tt>
</p><p>
Umm, what exactly is that <tt>Class.forName</tt> doing there?
</p>
<p>
This one is my fault.  Back in the early days of JDBC, we needed a way
for the JDBC DriverManager to locate drivers.  We arranged that newly 
loaded driver classes would register with the
DriverManager.  And then we asked that developers call
"Class.forName" to force the driver class to be loaded.
<a href=http://mustang.dev.java.net><img alt="Mustang.gif" src="http://weblogs.java.net/blog/kgh/archive/mustang.110.gif" width="110" height="63" hspace=10 vspace=3 align=right></a>
</p><p>
Sigh.  This is an ugly wart.  I'm happy to report that this one is
going away as part of JDBC 4.0 in 
<a href=http://mustang.dev.java.net>Mustang</a>.  The JSR-221 Expert Group
is adding a new mechanism so that the JDBC DriverManager can locate
and load driver classes without the need for developers to explicitly
type <tt>Class.forName</tt>.  So you will be able to just do the obvious:
<pre><tt>    Connection con = DriverManager.getConnection("jdbc:fred:fredsite.com");
</pre></tt>
</p><p>
<b>#4: Locating Resources in J2EE</b>
</p>
<p>
In J2EE 1.4, if you wanted to locate a reference to a remote EJB you needed to type:
<pre><tt>     Context context = new InitialContext();
     Object obj = context.lookup("fred");
     FredHome fred = (FredHome) PortableRemoteObject.narrow(obj, FredHome.class);
</pre></tt>
</p><p>
Yikes.  What on earth is going on with that <tt>PortableRemoteObject.narrow</tt>?
I have to confess that I'm one of the prime culprits here and, given some of
the constraints,  it may have been unavoidable.  But I think this one definitely does
win "Ugly Boilerplate of the Year".
</p>
<p>
As part of <a href=http://glassfish.dev.java.net>Java EE 5</a>, 
there are now specific mechanisms for dependency
injection, so you can now replace that code with a simple annotated
field definition:
<pre><tt>     @Resource FredHome fred;
</pre></tt>
</p><p>
And then the Java EE runtimes will take care of locating the resource,
doing the "narrow" for you and injecting the resource object into your field.
By default the resource name is inferred from the field name and the 
type is inferred from the field type.
</p>
<p>
This is an example of using JSR-175 annotations to restructure how we
handle a common task so that it can become much simpler.  I'm very
excited with what is happening with annotations as part of Java EE 5
- I think it is allowing us to greatly simplify Java EE programming.
And I'd like to find more ways to use annotations in Java SE, too.
<p>
<b>#5: Iterating over Collections</b>
</p>
<p>
My last example is from Tiger.  We've all been used
to typing some standard boilerplate for iterating over collections, such as:
<pre><tt>    Vector&lt;Wombat&gt; v = getWombats();
    Enumeration&lt;Wombat&gt; e = v.elements();
    while (e.hasMoreElements()) {
	Wombat w = e.nextElement();
        ...
    }
</pre></tt>
</p><p>
Josh Bloch successfully argued for a language change to make it easier
to iterate over both collections and arrays, so now in Tiger we can do:
<pre><tt>    Vector&lt;Wombat&gt; v = getWombats();
    for (Wombat w : v) {
        ...
    }
</pre></tt>
</p><p>
We all knew this would be useful, but I have been really surprised by how
much I have enjoyed using it, for both arrays and collections.  This
has turned into one of my favorite Tiger features.  The resulting code
is distinctly easier to read, partly because we have managed to eliminate
an unnecessary local variable.
</p>
<p>
This is an example of fixing a boilerplate problem we barely realized
we had.  I'd like to find a few more things like this!
</p><p>
<b>To be continued...</b>
</p><p>
I'll continue this topic in my next blog.
</p><p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>]]>

</content>
</entry>
<entry>
<title>Help Crack The Java Verifier</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2005/10/help_crack_the_1.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-10-31T02:05:24Z</issued>
<id>tag:weblogs.java.net,2005:/blog/kgh/159.3358</id>
<created>2005-10-31T02:05:24Z</created>
<summary type="text/plain">Sun is asking the developer community to help attack the new
bytecode verifier in Mustang.  Here&apos;s some background on how 
and why the community can help here.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>
<dc:subject>Community: JDK</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<p>
<script src="http://weblogs.java.net/blog/kgh/archive/buttons.js" type="text/javascript"></script>
Sun is asking the developer community to help 
<a href=https://jdk.dev.java.net/CTV/index.html>attack the new
bytecode verifier</a> in Mustang.  Here's some background on how 
and why the community can help here.
</p>
<p>
In developing Java SE 6 ("Mustang") we have adopted a more open, community-based, development model.  As part of
that we are releasing complete binaries and sources for all our 
weekly Mustang builds at
<a href=http://mustang.dev.java.net>mustang.dev.java.net</a> and
we are also recruiting community contributions into the release.
</p>
<p>
In previous JDK releases we had waited until the  releases were
functionally  complete and stable before we released our first 
binaries as official betas.   And we waited even longer (often until
final release) before making available full source for the releases.
After all, why bother to release incomplete builds or non-final sources?  We all want to be seen and judged on our best work,
not on our rough drafts, right?
</p>
<p>
Well, we were partly right and partly wrong.
There are many customers who are only interested in seeing
the final, stable end product.  They want to download something that
will work well for them and they don't want to see the intermediate
development steps.  That approach is perfectly valid and makes a lot
of sense for many busy customers.  And we don't want to delay or 
distract those customers.
</p>
<a href=http://mustang.dev.java.net><img alt="Mustang.gif" src="http://weblogs.java.net/blog/kgh/archive/mustang.110.gif" width="110" height="63" hspace=10 vspace=3 align=right></a>
<p>
However, it is also clear that there are many developers who would
like to act as collaborators in helping to make Java SE
better, both by reviewing the work in progress and by actively
contributing code and insight into the release.  For that community,
exposing rough drafts makes perfect sense.  These are our coauthors
who are helping us create the final work.  That is why we created
the <a href=http://mustang.dev.java.net>mustang.dev.java.net</a>
collaboration site so we could expose interim builds, get feedback,
and incorporate changes from the community.
</p>
<p>
We've already been receiving a lot of feedback on Mustang based
on the various weekly builds.  That has been much appreciated and
has been helping us to tune and adjust the release as we go along.
Thank you.
</p>
<p>
But now we have come to a particularly scary moment
and a particularly important
opportunity for the community to contribute to Mustang development.
As part of Mustang we will be delivering a whole new classfile verifier
implementation based on an entirely new verification approach.
The classfile verifier
is the very heart of the whole Java sandbox model, so replacing both
the implementation and the basic verification model is a Really Big Deal.
See <a href=http://blogs.sun.com/roller/page/gbracha?entry=typechecking_jvml>Gilad Bracha's</a> blog for an overview of the new verifier plus links to the spec.
The new verifier is faster and smaller than the classic verifier, but
at the same time it doesn't have the ten years of reassuring shakedown
history that we have with the classic verifier.
</p>
<p>
The new verifier led us to an interesting test of our new development
philosophy.
Should we delay exposing the new verifier for as long as possible?
Or should we push it out, advertise it, and ask for the community's
help in reviewing it?   Well, I will confess that many of us had an
initial fit of the heebie-jeebies about publishing the source code for
the new verifier.  "But what if someone finds an ugly security hole?"
Gasp!
</p>
<p>
But that question does kind of answer itself, doesn't it?
If someone spots a problem <b>we can fix it</b> and we can fix it
<b>before</b> we finalize the release.  Happiness!
</p>
<p>
We think the new verifier model is sound and we are taking various
steps to review the actual implementation code.  But the more eyes
that can look at this before it goes into production use, the better.
</p>
<p>
As a result, Sun has launched the
<a href=https://jdk.dev.java.net/CTV/index.html>Crack the Verifier</a> initiative.  Read the
<a href=https://jdk.dev.java.net/CTV/challenge.html>article</a> for more details, but broadly Sun is
looking for security experts and astute hackers in the Java community
who can help review the new verifier and help discover any potential
holes in time for them to be fixed in Mustang.

</p>
<p>
I hope people will rise to this challenge.
This is definitely a case where broad community involvement can trounce
what any one individual company can hope to do on its own.  I hope
this will be an opportunity to demonstrate that community-based
development can really help improve a core area of a key Java technology.
</p>
<p>
Now, I'll also be extremely happy if what happens is that a lot of
people look at the new verifier and no one finds any holes.  That
will be a good outcome!   But if there are any holes, let's find
them now...
</p>
<p>
<table>
<tr>
<td width=402>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>]]>

</content>
</entry>
<entry>
<title>Java SE and the Google Toolbar</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2005/10/java_se_and_the.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-10-04T20:04:52Z</issued>
<id>tag:weblogs.java.net,2005:/blog/kgh/159.3377</id>
<created>2005-10-04T20:04:52Z</created>
<summary type="text/plain">Sun has announced an agreement with Google to distribute the
Google toolbar along with consumer Java SE downloads from
java.com.  Here&apos;s what is happening and why.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>
<dc:subject>J2SE</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<p>
Sun has announced an agreement with Google to distribute the
Google toolbar along with consumer Java SE downloads from
<a href=http://java.com>java.com</a>.
Here's what is happening and why.
</p>
<p>
<b>The Background</b>
</p>
<p>
We've been working for several years to increase adoption of the 
latest Java SE Runtime Environment (JRE) among home consumers on
the internet.
We've been pursuing two tactics.  First, we've been working with
the major PC hardware vendors to include the JRE on new PCs.
That has been very successful - a majority of new PCs now ship
with the JRE preinstalled, which is great.  Second, we created
the <a href=http://java.com>java.com</a> site as a new consumer friendly site where 
consumers could easily download the JRE, at zero cost.  That has 
also been wildly successful and we are getting a very high volume
of consumer downloads (well over ten million a month).
</p>
<p>
That's been great progress, but of course we
are eager to find even more ways of reinforcing Java technology
on the desktop.
At the same time, we want to be careful not to do anything that
would be onerous or unpleasant or otherwise discourage consumers from
using Java.  And even more importantly, we want to be very sensitive to 
the needs of Java developers and ISVs and we want to avoid 
changes which might interfere with developers' ability
to use or distribute Java.
</p>
<p>
In searching for possible opportunities, Sun got connected with the
Google toolbar team, who were looking for ways to encourage adoption
of the Google toolbar.  Our goals seemed very compatible.  Like Sun,
Google was extremely concerned to avoid doing things that would mislead
or annoy or disrupt consumers, which was very reassuring.
</p>
<p>
It probably also helped that many of us are avid users of google.com
and that Google in turn does a lot of Java development and contributes
to various JCP expert groups.  (Did you know that Google is a
<a href=http://jcp.org/en/participation/committee>JCP Executive Committee</a> member?)
</p>
<p>
<b>What We're Doing</b>
</p>
<p>

Here's what we have announced and what we will be rolling out
over the next few months.
</p>
<p>
We will be adding some options to the Windows JRE installation from java.com.
These options will allow downloading and installation of the Google toolbar
(and possibly other Google tools in future) as part of the Windows JRE 
installation.  I want to emphasize that these will be <b>options</b>.
If someone doesn't want these tools they can easily opt out and still
download and install the JRE.
</p>
<p>
Our core principle here is to avoid forcing anything on anyone.
So we will take care to make it clear to end users what is going
on and we won't force the toolbar or other tools on people who 
don't want them.  (Yes, I know that probably sounds kind of obvious, 
but we don't want any misunderstanding on that point!)
</p>
<p>
If someone wants to uninstall the Google tools
they will be able to do that, while leaving the JRE installed (and
vice versa).  Again, this is about allowing reasonable end user 
choices, with no hidden "gotchas".
</p>
<p>
These changes are primarily focused on the consumer JRE downloads
hosted from java.com (although they may also affect some related
"online" JRE installation bundles on java.sun.com).  The way that
the "online" installers work is that a small initial installer is
downloaded and it then downloads additional material depending on
which options the end user selects.  So, as with other optional 
material, the Google tools will only be downloaded if the end user
actually selects them.
</p>
<p>
Note that we are <b>not</b> requiring developers or ISVs to redistribute
the Google toolbar with their applications.
In particular, the redistributable JRE bundles that developers
can redistribute with their apps won't include the toolbar.
</p>
<p>
Similarly, enterprise system administrators can continue to get
redistributable JRE bundles from java.sun.com for use in deployments
within enterprises, without the toolbar.
</p>
<p>
We are also looking into the possibility that in the future
we might offer
Google toolbars during JRE auto-updates.  If we do go down
that route we will again be very careful to make sure that
people can opt out and that there are no surprises or gotchas.
</p>
<p>
<b>Conclusion</b>
</p>
<p>
Hopefully this will be a good experience for everyone.  Consumers
will get an option to install useful search tools and Sun will
get some extra help around Java development and deployment,
especially as we head towards the new Java SE 6
<a href=http://mustang.dev.java.net>"Mustang"</a> release.
</p>
<p>
Finally, I'd like to offer Big Congratulations to Thorsten Laux, 
the Java SE Desktop Engineering Director for figuring all this out
and for driving and closing the agreement.  Thorsten is a key
champion of desktop Java and he has been relentless in
looking for opportunities to boost Java desktop adoption.
</p>
<p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>]]>

</content>
</entry>
<entry>
<title>Slides for JavaOne Technical Keynote</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2005/07/slides_for_java.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-07-11T01:31:27Z</issued>
<id>tag:weblogs.java.net,2005:/blog/kgh/159.2905</id>
<created>2005-07-11T01:31:27Z</created>
<summary type="text/plain">Here are the PDF slides for the JavaOne 2005
Technical Keynote.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<p>
Here are the PDF slides for the JavaOne 2005
<a href=http://weblogs.java.net/blog/kgh/archive/TK.2005.pdf>
Technical Keynote</a> (450 K).
</p><p>
The Technical Keynote is our attempt to provide a high
level overview of the roadmaps and big directions for
the core Java platform.  The rough agenda was:
</p>
<ul>
<li>Java<sup><font size=-3>TM</font></sup> SE Roadmaps (Graham Hamilton)
<ul><li>Mustang, Dolphin, and more</ul>
<li>Java<sup><font size=-3>TM</font></sup> EE Roadmaps (Bill Shannon)
<ul><li>Java EE 5, EJB 3.0, JAX-WS and more</ul>
<li>SOA (Mark Hapner)
<ul><li>Service Oriented Architecture and the Java platform</ul>
</ul>
<p>
The Java<sup><font size=-3>TM</font></sup> ME roadmaps were covered
in a special kickoff session for the Java ME track.  (We had way
too much material to fit into a single keynote session.)
</p><p>
The Technical Keynote aims to provide a high level overview to help
set direction at the start of the conference.  But the real technical
meat is, of course, in the individual technical sessions.
The PDFs for all the technical sessions will be going on-line in a
few weeks and those will provide much more detail on specific areas.
</p><p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>]]>

</content>
</entry>
<entry>
<title>Goodbye &quot;J2SE&quot;, Hello &quot;Java SE&quot;</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2005/06/goodbye_j2se_he_1.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-06-27T14:32:22Z</issued>
<id>tag:weblogs.java.net,2005:/blog/kgh/159.2648</id>
<created>2005-06-27T14:32:22Z</created>
<summary type="text/plain">We&apos;ve made some updates to the Java platform names.
Here&apos;s what has happened, and why.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>
<dc:subject>J2SE</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<p>
We've made some updates to the Java platform names.
Here's what has happened, and why.
</p><p>
<b><big>What has changed?</big></b>
</p><p>
We're modifying the names of all three Java platform editions.
</p><p>
First, we're dropping the "2" from the full edition names.  They are now:
<table>
<tr><td width=20><td>
<b>Java<sup><font size=-3>TM</font></sup> Platform, Standard Edition</b>
<tr><td width=20><td>
<b>Java<sup><font size=-2>TM</font></sup> Platform, Enterprise Edition</b>
<tr><td width=20><td>
<b>Java<sup><font size=-2>TM</font></sup> Platform, Micro Edition</b>
</table>
</p><p>

Second, we are emphasizing "Java" in the short-hand names:
<table>
<tr><td width=20><td>
<b>J2SE<sup><font size=-2>TM</font></sup></b>&nbsp;&nbsp;is
now&nbsp;&nbsp;<b>Java<sup><font size=-2>TM</font></sup>&nbsp;SE</b>
<tr><td width=20><td>
<b>J2EE<sup><font size=-2>TM</font></sup></b>&nbsp;&nbsp;is 
now&nbsp;&nbsp;<b>Java<sup><font size=-2>TM</font></sup>&nbsp;EE</b>
<tr><td width=20><td>
<b>J2ME<sup><font size=-2>TM</font></sup></b>&nbsp;&nbsp;is 
now&nbsp;&nbsp;<b>Java<sup><font size=-2>TM</font></sup>&nbsp;ME</b>
</table>
</p><p>

Finally, we are using single digit version numbers where possible.
So rather than saying "5.0" we will just say "5".
</p><p>
These names will be applied to new releases.  We won't change
the names or numbers of existing releases.  So Tiger will still be
"J2SE 5.0" but Mustang will be "Java SE 6".
</p><p>
So in the future expect to hear us talking about "Java SE 6" and "Java EE 5".
</p><p>

<big><b>Why the change?</b></big>

</p><p>
Well, I'm just a simple engineer and I definitely don't claim to understand
the exciting world of Naming and Branding.
</p><p>
However, the "2" was definitely starting to look out of place.  We introduced
the "2" back in 1998, and it seemed increasingly odd to have that "2"
embedded in the platform name while also having a version number like "5.0"
at the end of the name.
</p><p>
We also wanted to add more emphasis on the unity of the three editions.
They are all based on "Java" and it seemed worth making that "Java"
more visible in the shorthand names.
</p><p>
Finally, we got feedback from developers both inside and outside of Sun
that they'd prefer to see versions like "5" rather than "5.0".  That wasn't
what we had expected, but we've made that change.
</p><p>
We'd initially hoped to roll out the main name changes last year, for Tiger.
However, we realized that we couldn't just make the change for standard edition,
we also had to address micro edition and enterprise edition.  And of course they
needed to review the changes with licensees who would be impacted.  So we
decided we needed more time and Tiger stayed a "J2SE" release.
</p><p>
A far as I know (fingers crossed) we are finished with naming and numbering
changes and I'm not expecting any more anytime soon!
</p><p>
There is a full official description of the changes at:
<table>
<tr>
<td width=20>
<td>
<a href=http://java.sun.com/developer/technicalArticles/javaone2005/naming.html>
Building and Strengthening the Java Brand</a>
</table>
</p><p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>]]>

</content>
</entry>
<entry>
<title>IBM &amp; Microsoft at JavaOne</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2005/06/ibm_microsoft_a_1.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-06-24T19:53:55Z</issued>
<id>tag:weblogs.java.net,2005:/blog/kgh/159.2654</id>
<created>2005-06-24T19:53:55Z</created>
<summary type="text/plain">IBM, Microsoft, BEA, Nokia, Oracle and many others
will be presenting at JavaOne.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<p>
Like many others, I'm in final frantic preparations for JavaOne on Monday.
</p><p>
IBM have now joined the Platinum Sponsor list and like the other
Platinum Sponsors (BEA, Nokia, and Oracle) they will be presenting
their very own General Session.  See the general Session agenda at:
<table>
<tr><td width=40><td>
<a href=http://java.sun.com/javaone/sf/sessions/general/day3.jsp>
General Session Agenda
</table>
</p><p>
Also, many people seemed to have missed the fact that Microsoft
will be presenting.  In particular Andrew Layman who leads the
Web Services work at Microsoft, will be co-leading the kickoff
session for the "Java and .NET Interoperability Day" within JavaOne.
This is at 9:45am on Wednesday.

<table>
<tr><td width=40><td>
<a href=https://www35.cplan.com/javaone05_93_1/session_details.jsp?isid=272530&ilocation_id=93-1&ilanguage=english>
Interoperabillty Day Kickoff Talk
</table>
</p><p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>]]>

</content>
</entry>
<entry>
<title>&quot;Evolving the Java Platform&quot;</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2005/05/evolving_the_ja_2.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-05-17T17:49:25Z</issued>
<id>tag:weblogs.java.net,2005:/blog/kgh/159.2457</id>
<created>2005-05-17T17:49:25Z</created>
<summary type="text/plain">Here&apos;s a link to my SD Times article on &quot;Evolving the
Java Platform&quot; which discusses Mustang, Dolphin and more.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>
<dc:subject>J2SE</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<p>
The kind folks at Software Development Times asked me to write
an article on 
the future directions for the Java platform.  This has now
surfaced in
their May 15th edition as
<a href=http://68.236.189.240/article/special-20050515-01.html>
Evolving the Java Platform</a>.
</p><p>
This includes some thoughts on the planned directions
for Mustang, Dolphin, and J2EE 5.0.
</p><p>
They also broke out a separate short article on
<a href=http://68.236.189.240/article/special-20050515-02.html>
 Increasing Transparency: Project Peabody</a>
which discusses some of the things we are doing to 
simplify J2SE licensing and encourage community
contributions into Mustang.
</p><p>
We'll be talking in more detail about all these topics (and
a lot more) at <a href=http://java.sun.com/javaone>JavaOne 2005</a>,
June 27-30 in San Francisco.
</p><p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>]]>

</content>
</entry>
<entry>
<title>Thoughts on the Apache J2SE &quot;Harmony&quot; Project</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2005/05/thoughts_on_the_1.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-05-07T18:09:22Z</issued>
<id>tag:weblogs.java.net,2005:/blog/kgh/159.2405</id>
<created>2005-05-07T18:09:22Z</created>
<summary type="text/plain">Apache have proposed a new project &quot;Harmony&quot; to create an open
source J2SE implementation.  Here are a few thoughts and comments
from a Sun perspective.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<p>
Apache have proposed a new project "Harmony" to create an open
source J2SE implementation.  Here are a few thoughts and comments
from a Sun perspective.
</p><p>
Sun is a big supporter of Apache (this includes
making donations of hardware and storage) and we're always
very glad to see them participate in Java development.   In many
ways launching a J2SE project is the obvious next step in Apache's
work around Java.  Personally, I am very curious about
how the Harmony project will work out - creating a full scale implementation
of J2SE is a mammoth task, as the Sun J2SE team knows only too well.  
However I wish Apache success and we'll certainly be tracking this
as it develops.  We'll probably participate in the project at some
level, although most of our efforts will continue to be focused on
building Sun's reference implementation of J2SE.
</p><p>
Apache have been an active participant in the Java Community
Process for many years and they have been a JCP Executive Committee
member since June 2000.  Various Apache
projects have created (or are developing) compatible implementations
of JCP standards. For example, the Apache Geronimo project is working
to  create a full compatible J2EE 1.4 implementation.
</p><p>
Part of the reason these Apache projects are possible is that 
the JCP has been working over the last few years to clarify the role
of open source projects and also to improve overall transparency.
For example there were changes to the intellectual property rules
in JCP 2.5 specifically designed to allow open source implementations.
There have also been a number of transparency improvements in JCP 2.6
to allow earlier access to specification information.
In addition to those JCP updates, Sun created a scholarship program
under which we have provided Apache (and other not-for-profit groups)
with free access and free support for Sun's Java compatibility test suites.
</p><p>
Building on all this JCP work, Apache has now proposed an incubator
project that is intended to
eventually create a full compatible implementation of the core Java
platform, J2SE.  See the
<a href=http://mail-archives.apache.org/mod_mbox/incubator-general/200505.mbox/%3cCA4BEB82-3D84-457D-9531-1477DD749919@apache.org%3e>
Harmony project proposal</a> and the associated 
<a href=http://mail-archives.apache.org/mod_mbox/incubator-general/200505.mbox/%3cE3603144-2C26-4C31-896D-6CC7445A63EB@apache.org%3e>
FAQ</a>.
</p><p>
By the way, if you are interested in learning more about Harmony, Geir 
Magnusson from Apache has kindly agreed to give a talk
on Harmony at <a href=http://java.sun.com/javaone>JavaOne 2005</a>.  
</p><p>
Apache have always been a strong supporter of the Java compatibility
program and I'm glad to see that they are emphasizing that commitment
to compatibility as part of the Harmony project.  Compatibility is
one of the bedrock values of the Java community.
As a community we're making a collective investment in creating and
using a set of common standards on the basis that all the implementations
will actually conform to the same specifications and pass the same
detailed compatibility tests.  This is what allows developers to
create portable applications which can run in a variety of Java
environments.
</p><p>
The licensing rules for J2SE 5.0 were carefully designed to
allow independent, compatible open-source implementations of the
J2SE specification.
Personally, I am not entirely sure if the world really needs a 
second J2SE implementation, but at the same time I am also 
glad to see that all the effort we put into getting the rules and the
licensing issues straightened out is actually proving useful!
</p><p>
Finally, I should point out that the spirit of openness and
collaboration around JCP standards is not unique to Apache.  For
example, Sun has been working
to become much more open and collaborative in how we develop the
J2SE specification and the J2SE reference implementation.
We are publishing full weekly source and binary snapshots of
J2SE 6.0 ("Mustang") at
<a href=http://mustang.dev.java.net>mustang.dev.java.net</a>
and we are welcoming contributions into that work.  So I 
encourage people to review and contribute into that project too!
</p><p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>]]>

</content>
</entry>
<entry>
<title>J2SE 5.0 Update 3: the Third Tiger Cub</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2005/04/j2se_50_update.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-04-28T22:00:32Z</issued>
<id>tag:weblogs.java.net,2005:/blog/kgh/159.2368</id>
<created>2005-04-28T22:00:32Z</created>
<summary type="text/plain">J2SE 5.0 Update 3 went out today, so I wanted
to share a few notes on what is happening with
the Tiger update releases.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>
<dc:subject>J2SE</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<img align=right alt="TigerCub4.JPG" src="http://weblogs.java.net/blog/kgh/archive/TigerCub4.JPG" width="206" height="196" />

<p>
J2SE 5.0 Update 3 went out today, so I wanted
to share a few notes on what is happening with the Tiger update
releases.
</p><p>
<b>The Update Release Process</b>
</p><p>
The update releases are intended to each deliver a small
number of important bugfixes between our major releases.
We have now delivered three updates for Tiger: Update 1 had
124 fixes, Update 2 had 117 fixes and Update 3 has 79 fixes.
For descriptions of the fixes see the
<a href=http://java.sun.com/j2se/1.5.0/ReleaseNotes.html>
5.0 Update Release Notes</a>.
</p><p>
The update releases are intended to be very small and non-disruptive.
So there are no API changes and the release teams are very conservative
in which bug fixes they accept.  We are very conscious that one customer's
bug fix can easily turn into an unintended problem for another customer.
As part of a release like Tiger or Mustang
we have an extensive beta program with long bake periods.  This
allows us to
make a larger volume of changes and also to make riskier
changes which require significant public exposure and testing. 
The update releases are intended to provide fast relief for
a small number of key issues.  They do still get a lot of 
heavy-duty QA attention (including a full QA test cycle),
but they don't get the long bake periods and enormous
QA analysis associated with a major release.
</p><p>
<b>There won't be a 5.1</b>
</p><p>
In case you have been wondering, there isn't going to be a 5.1 release.
</p><p>
We will be going straight from Tiger to Mustang, with only small
update releases in between.  There won't be anything comparable
to 1.4.1 or 1.4.2.  
Mark Reinhold provided a description of the New Release Model in his 
<a href=http://weblogs.java.net/blog/mreinhold/archive/2004/09/tigers_and_must.html>
Tigers and Mustangs and Dolphins, Oh My!</a> blog.  The main goal is
to increase the predictability of releases and to allow us to deliver
new functionality in a shorter window than the fairly long
gap between 1.4 and 5.0.
</p><p>
We know some people like to wait for the ".1" release before moving
to a major new software release.  So we did consider renaming
"5.0 Update 3" as "5.1" just for that reason.  But that seemed like it
might cause more confusion than it would solve.  But if it makes
you feel better, you can think of 5.0 Update 3 as the ".1" release of
the Tiger family.
</p><p>
So please don't wait for 5.1 to appear: it won't.  Go straight to 5.0 Update 3!
</p><p 
<b>Java.com and auto-update</b>
</p><p>
We will <b>not</b> be releasing 5.0 Update 3 on java.com or via auto-update.
Here's why.
</p><p>
Our goal is that the update releases be boring.  Seriously!
They are intended to deliver fixes that will be important to
some customers, but they aren't normally a "must-have" item
for typical Java end users.  So we don't necessarily want to
push them all out to our mass consumer audience.
</p><p>
Java.com and the java auto-update mechanism are primarily targeted
at making it easy for home consumers to get the JRE.  
As part of that, we're trying to make sure that the latest version available via 
java.com is the same as the latest version available via auto-update.
But this won't necessarily always be the same as the latest release
that is available on java.sun.com.
</p><p>
We will occasionally use auto-update to propagate a new version
out to the consumer audience, but we want to do that sparingly.
In March we enabled auto-update from 1.4.X to 5.0 Update 2 and as a 
result millions of consumers chose to do an auto-update
to Tiger.  We're glad they did that, but we don't want to bother
them with another auto-update again too quickly.
</p><p>
Or to say it slightly differently: developers and expert users
who choose to do direct downloads from java.sun.com will sometimes
have access to more recent update releases than the main consumer
downloads available via java.com.  Think of that as an extra benefit
for using java.sun.com!
</p><p>
<table>
<tr>
<td width=400>&nbsp;</td>
<td> - Graham </td>
</tr>
</table>
</p>]]>

</content>
</entry>
<entry>
<title>JavaOne Review Madness</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/kgh/archive/2005/02/javaone_review.html" />
<modified>2008-01-02T17:42:16Z</modified>
<issued>2005-02-07T21:20:53Z</issued>
<id>tag:weblogs.java.net,2005:/blog/kgh/159.2012</id>
<created>2005-02-07T21:20:53Z</created>
<summary type="text/plain">The JavaOne call for papers ended last week.
Here are a few thoughts as we work through the
review and talk selection process.</summary>
<author>
<name>kgh</name>

<email>kg_hamilton@sun.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/kgh/">
<![CDATA[<p>
The JavaOne call for papers ended last week.  We received
over 1700 proposals and we're now deep in talk review.
Here are a few thoughts from inside
the Program Committee on what we're seeing in the submissions
so far and the balance we're working towards this year.  We
want to deliver a great and useful conference for people,
so we're consciously trying to make sure we have the
right balance of topics.
</p><p>
<b>What do people want?</b>
</p><p>
There are some common strands in the feedback we receive
from JavaOne attendees.  For example, most people want to
see increased technical depth and less introductory fluff.
But there are also a lot of differences in
the kinds of talks people want and the areas they want
covered.  We try to be pragmatic in meeting people's needs,
and one of the criteria we use in balancing the conference
is to look at what kinds of talks people did (and didn't)
attend in previous years.
</p><p>
There tends to be very strong interest
in the practicalities of building real-world enterprise
applications, on both client and server and we'll make
sure those areas are well-covered.  But there is also
a lot of interest in future directions and in emerging
technology areas.  JavaOne is really the only event where
the full diversity of Java development comes together under
one roof and people seem to value being able to sample
that whole diversity, even if their main focus is more
narrow.
</p><p>
<b>Standard v non-standard technologies?</b>
</p><p>
JavaOne is definitely the great annual festival of JCP
standard technologies.  So we try to make sure we have talks
covering the latest key JSRs, especially on the main
directions for the core platforms.  We'll definitely
have lots of "how to" talks on J2SE 5.0 (Tiger) and 
J2EE 1.4, and forward looking talks on the 
plans for J2SE 6.0 (Mustang)
and J2EE 5.0.  We have a lot of good submissions here
(and we also know where to go hunting to fill in any gaps!)
</p><p>
But there are also lots of other technologies being
used by the community beyond JSRs.  This year we're
making a deliberate effort to have more talks here.
For example, the track owners have been actively recruiting
talks on technologies such as Hibernate, the Spring Framework,
SWT, Tapestry, etc.  So I'm expecting we'll see increased
coverage of non-JCP technologies.
</p><p>
<b>Product talks</b>
</p><p>
Product talks are a really sensitive area.  We've had
some really grumpy feedback from attendees who feel they
were abused with a sales pitch.  But other people have
told us they really <em>like</em> getting updates
on key products!
</p><p>
Our current thinking is to try to include a small
set of product focused talks, but with two big rules.
First, it must be really clear in the talk title
that the talk is product focused.  (People seem to be
be much more tolerant of product focused
talks if they know the focus in advance.)
Second, the talk
must actually be technically interesting, not just
sales babble.  So typically we'd like a talk from
a senior engineering lead on the product.
</p><p>
Last year Steve Wilson organized a great set of tools
talks with a common theme of "What's new in XXX" for
JBuilder, Eclipse, NetBeans, and other IDEs.  That
seemed to work really well.  We're planning to repeat
that again for tools. We're also working to
recruit a similar set of product update talks for 
the main App Server products (Weblogic, Websphere,
JBoss, Sun App Server, etc.)
</p><p>
<b>Vendor balance</b>
</p><p>
There tend to be a lot of Sun talks at JavaOne.  That
largely reflects Sun's role in leading many key JSRs,
especially for the core platforms.
</p><p>
But we consciously strive to include the whole community,
including all the leading Java product vendors.  This
sometimes includes doing some deliberate talk recruitment
to fill key gaps.
Sometimes people who are working head down on products
forget about boring events like conferences!
</p><p>
This year I'm seeing a good set of talk proposals from most
of the main vendors.  The one gap I'm noticing is that so 
far I haven't run into many submissions from IBM, but we
are trying to recruit some specific talks (for example 
on Eclipse and SWT) to help out there.
</p><p>
<b>The Fashion of the Year</b>
</p><p>
There often seems to be a Fashion of the Year.  This year
it's SOA and we have received a vast host of SOA talk submissions.
That's the good news: the bad news is that many of the abstracts
are very similar!
</p><p>
Four years ago XML was new and hot,
and we had vast numbers of talk submissions on how to connect
XML into JSP or servlets.  This was an important topic, but
there was only so much that could be said on it and many
of the abstracts were duplicative.
</p><p>
Similarly with SOA: it's an important topic and I'm sure
we'll include some key talks on it, but probably not in
proportion to the number of submissions.

</p><p>
<b>"Practical Experience" talks.</b>
</p><p>
Something weird seems to happen around "Practical Experience"
talks.  We get told by attendees that they want to see more
talks based on real-world experience, but in practice average
attendance tends to be low and audience feedback is very mixed.
</p><p>
Part of the problem here is that these talks can easily
degenerate into "what I did on my summer holidays" kinds
of talks.  The audience wants more than just a simple
narrative of what someone did in their project.
</p><p>
We will be accepting some practical experience talks,
but we are going to be more cautious in trying to make
sure there will be real lessons for the audience and
we will try to work more closely with the speakers in
preparing these talks.

</p><p>
<b>Back to work</b>
</p><p>
Well, this was a nice break, but now I have to get back
to reading more session abstracts...
</p><p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- Graham
</p>]]>

</content>
</entry>

</feed>