Heads up to the group that I had to make a backwards incompatible change to the 
interface processing.  

Specifically some interfaces that were previously treated implicitly as @Local 
now will need the @Local annotation.  I hope we can add a backwards compatible 
flag before we release -- easy to do, we just need a nice name for it and to 
test it.

Per the strict rules of the spec this has always been allowed:

  public interface Color {}
  
  public class ColorBean implements Color {
  }

Here, Color is implied to be an @Local interface.  But per spec rules, this was 
considered an error:

  public interface Color {}
  public interface Colour {}
  
  public class ColorBean implements Color, Colour {
  }

We've always treated that as two @Local interfaces.  Additionally, this has 
also been illegal per-spec, but allowed by us:

  public interface Color {}
  
  public class ColorBean implements Color {
  }

  public class RedBean extends ColorBean {
  }

In this scenario we would imply the RedBean to have one @Local interface, Color.

It's specifically this last scenario that is somewhat at odds with the current 
spec notions.  In the new rules the above RedBean would be considered an 
@LocalBean with no other views (i.e. no @Local interface).  If we imply the 
RedBean to have a business local interface Color, it breaks compatibility with 
the TCK.  In an incredibly harmless way to be sure, but still.

Anyway, having thought about it for a while it seemed less terrible to me, 
since RedBean would now be treated as an @LocalBean it will automatically have 
all the java type of the super class and all interfaces implemented, so the 
proxy itself will have no loss in functionality -- you will still be able to 
cast it to Color.

Where there is a loss in functionality is in how it can be referenced.  Namely, 
this will no longer work:

  public class AnotherBean {
  
      @EJB Color colorBean;
  }

Since the RedBean doesn't have a Color business local interface in a strict 
sense, this reference will not work.  Here's where we should make an 
improvement to our @EJB processing code (EjbResolver).

Ideally, a reference like '@EJB Color colorBean' would still work because the 
bean has a view (the @LocalBean view) which is of a type that is assignable to 
Color.

This isn't required for TCK compliance, but definitely something we should add 
so that there is as little breakage as possible.

We should also add a flag so that unclassified interfaces still get treated as 
@Local as the did before.  Anyone have a name suggestion?

Off the top of my head:

  openejb.imply.businesslocal
  openejb.interface.businesslocal.implied (default would be false)
  openejb.interface.businesslocal.strict (default would be true)

Something....  Open to ideas.  Note we already have a related:

  openejb.strict.interface.declaration

Which when set follows the spec rules rigidly.  When not set, we try to offer 
as much functionality as possible without making the TCK angry :)

Maybe we want to go with something that at least starts with 
"openejb.interface." so that if we have other things people might want to turn 
on/off, the properties would at least be sort of logically grouped.

Course, now that I think of it our 'Options' util class supports converting a 
previously true/false option into an java enum.  'true' implies all enum 
options, 'false' implies none.  And individual options can be listed to more 
specifically configure behavior.  So if we go with that thinking (might be 
overkill, so who knows), we could end up with something like this:

 openejb.strict.interface.declaration=local, inheritance, mixed

Where 'local' would tell us if we should be strict with requiring @Local.  The 
'inheritance' would tell us if we should consider interfaces and annotations in 
super classes.  And 'mixed' might tell us if we should allow an interface to be 
both @Remote and @Local.  So again, 'true' would imply all options, and 'false' 
would imply non.  The default would be 'local' for compatibility reasons.  That 
pretty much covers what we currently use the strict flag for.

Might be a little specific, but on the positive side there will be fewer actual 
properties for users to learn about.

Thoughts?


-David

Reply via email to