Hi Steven,

I like the ideas that you present here and only have a minor comment. Maybe you're not aware of this, but as for the declarations, you can use a variety of languages to provide the implementations of your elements, as long as they run on the JVM. So maybe we should use another term instead of "package", but then again it does seem totally appropriate to use it for this mechanism, guess I'm not sure about it.

The implementation of this feature will take quite a long time because the current site builder hasn't got the required capabilities to do this. Sadly, I will not be able to dedicate time to this before three months.

Best regards,

Geert

On 28 Jun 2006, at 21:09, Steven Grimm wrote:

I filed this in JIRA (bug 285) and Geert suggested I send it to the mailing list to get others' comments.

This is sort of a followon to bug 269 (about implementing the <autolink> tag). You could just about eliminate the need for site configuration if RIFE would automatically discover elements. You would pretty much only need to declare each entry point of the site in the XML configuration. Here's one way it could work.

<site>
   <element id="home" implementation="com.foo.element.Home" />
   <subsite ...> (if you want subsites)
<element ...> (if you want to, you can still explicitly declare stuff as before)
   ... other <site> stuff ...
</site>

RIFE scans com.foo.element.Home and finds a couple of "autolink" annotations, e.g.

@Autolink(srcexit="register")

There is no known element by that name yet, so RIFE searches for a class with that name in the same package as the linking class, in this case com.foo.element.Register. If it finds such a class and the class has an @Elem annotation, the class gets added as an element (and its exits are evaluated similarly).

That gets you all the elements that are connected via exits from each of the declared elements. You could take that one step further:

<site package="com.foo.element">
  <arrival destid="home" />
  <subsite id="members" inherits="AuthMember" />
<subsite id="admin" inherits="AuthAdmin" package="com.foo.element.admin" arrival="adminMenu" urlprefix="admin" /> <element id="AuthAdmin" ...> (same as the usual auth element) </ element>
  <element id="otherEntryPoint" />
  ...
</site>

The home page of this site is the element com.foo.element.Home (it is a configuration error if that class doesn't exist or isn't annotated as an element.) It has an authenticated members-only subsite whose elements are in com.foo.element (they will be discovered by the algorithm above since there are presumably exits leading from the public site to the members-only sections). It has another subsite whose elements are in com.foo.element.admin and whose arrival element is ID "admin.adminMenu" implemented by class com.foo.element.admin.AdminMenu.

It also has a second entry point whose class is com.foo.element.OtherEntryPoint. That class will be scanned for connected peers just like the Home class. This would be needed for parts of sites that aren't reachable by exits from the arrival pages. (In practice I'd think that would be pretty rare, but the ability is there.)

This leaves just one class of elements that need to be declared, namely embedded elements that are never pointed to by an exit. I assume it's not really an option to have those elements be discovered and added to the configuration on the fly as they're referenced by elements (though if it *is* possible, that's the ideal approach). So maybe allow embedded elements to be listed in the annotations of the classes that use them:

@EmbeddedElement
public static final String ELEM_COMMENT_FORM = "commentForm";

or, in the class's @Elem annotation,

embeds = { @EmbeddedElement(name="commentForm") }

or, if needed, with an implementation class declared (as a class object so IDE refactoring finds it easily, or as a string):

@EmbeddedElement(implementationClass=com.foo.forms.CommentForm.class)
public static final String ELEM_COMMENT_FORM = "commentForm";
@EmbeddedElement(implementation="com.foo.forms.LoginForm")
public static final String ELEM_LOGIN_FORM = "myCrazyLoginForm";

This proposal does not remove any of the expressive power of RIFE's configuration. You can still explicitly specify anything you need to, either in XML or in annotations. (And you still have to configure the elements themselves via annotations, though with bug 269 that configuration would get a lot less complex.) It is simply a change in the way RIFE acquires the same underlying configuration data.

Something like this would mean that for a lot of sites, you can set up a small configuration once at the start of the development effort and never touch the central config again as the site expands, while still getting the advantages of RIFE's loosely- coupled element architecture. A small config file would be able to describe an arbitrarily complex site. This would be an especially big win for new developers, who wouldn't have to muck with unfamiliar config files until they were ready to do something unusual. ("Get productive right away.")
_______________________________________________
Rife-users mailing list
[email protected]
http://lists.uwyn.com/mailman/listinfo/rife-users


--
Geert Bevin
Uwyn "Use what you need" - http://uwyn.com
RIFE Java application framework - http://rifers.org
Music and words - http://gbevin.com


_______________________________________________
Rife-users mailing list
[email protected]
http://lists.uwyn.com/mailman/listinfo/rife-users

Reply via email to