The advantage of this approach, the way I see it, is that it allows you to declare all your 'views' or 'transfer objects' in xml, and have them strongly typed (as opposed to formbeans) - and that it works well with BeanUtils.copyProperties.

Are there any disadvantages at the back-end because of the map-backed nature? I mean in the EJB layer?


  I have been doing this but using a xml configuration file, using a Struts
plugin. It falls on something like this:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE views PUBLIC "-//04Web//DTD Horizon Configuration 1.0//EN"
    "http://www.04web.com/dtd/horizon-config_1_0.dtd";>
<views>

    <view name="usersView">
        <dyna-property property="users"      type="java.util.Collection"/>
        <dyna-property property="flag"       type="java.lang.Boolean"/>
    </view>

</views>

(similar to struts-config)

  I did this because I found it a bit confusing mixing bean attributes to
retrieve html form data and attributes to deliver the intended presentation.

  I use a "view" factory to retrieve the bean definitions and then do
something like:

  view.set("property", object); (I extended the DynaBean and implement the
Map interface to achieve this - much simpler and JSTL friendly)

...you could also use BeanUtils for setting the properties.


A simple module aware configuration:


<!-- HORIZON PLUGIN -->

<plug-in className="com.ohforweb.horizon.HorizonPlugin">

        <set-property property="config-files"
value="/WEB-INF/horizon-config.xml"/>

<set-property property="parser-validate" value="true"/>

<set-property property="module-aware" value="true"/>

</plug-in>

  When I send the request I usually send a "view". If aa prepopulated html
form is to be presented I send a "view" and a form bean.

Voila :)

Pedro Salgado
(http://www.04web.com/)


----- Original Message -----
From: "Adam Hardy" <[EMAIL PROTECTED]>
To: "Struts Users Mailing List" <[EMAIL PROTECTED]>
Sent: Wednesday, March 17, 2004 2:07 PM
Subject: Re: action - delegate - facade



Is it safe? I really don't know. You'd have to ask someone else.... or
wait until I've got a couple of years experience with the service
locator pattern, and I'll let you know ;)

but regarding value objects - you use BeanUtils to copy the properties
into the form beans?



On 03/17/2004 12:34 PM HG wrote:

ehh..Correction to third answer...

Actually the plugin caches the reference to the EJB Facade and the

Service


Locator caches the home looked up from JNDI...

Is this really safe..?? :-)


----- Original Message ----- From: "HG" <[EMAIL PROTECTED]> To: "Struts Users Mailing List" <[EMAIL PROTECTED]> Sent: Wednesday, March 17, 2004 12:31 PM Subject: Re: action - delegate - facade




Hi Adam.

Your first question, regarding packaging
I keep that part simple, so I place all value objects in a model

package,


say "com.mycompany.myproduct.model". Both the ejb-jar and the web-jat
contain these classes.

Your second question, regarding generation value objects
I use xDoclets facilities to generate value objects. If I need special
services/attributes in the value objects I subclass the one generated by
xDoclet and roll my changes.

Your third question, regarding home lookups.
I use the ServiceLocator pattern from my business delegates(plugins).

The


service locator is implemented as a Singleton and contains only Facades.

I


have antoher another singleton ServiceLocator for Entities.
Each plugin caches the home of the "Business Services" it uses (ie. the
Facades).

Hope to help...otherwise....feel free to ask.

Best regards

Henrik


----- Original Message ----- From: "Adam Hardy" <[EMAIL PROTECTED]> To: "Struts Users Mailing List" <[EMAIL PROTECTED]> Sent: Wednesday, March 17, 2004 11:01 AM Subject: Re: action - delegate - facade




I am surprised to see that the xpetstore @ sourceforge has a direct
interface between Actions and the session beans.

The delegate does make sense to me now and I'm going to implement it.

One think I've been wondering is about packaging all the classes. Do

you


put the delegate classes and the transfer / value object classes in a
seperate jar file from the action classes, and from the EJBs?

While on the subject, what do you use for value objects? Form beans or
something generated by xdoclet? I've been using an xml schema to
generate my value objects so far (not with EJB) via JAXB, but this

isn't


going to work with EJB because the things aren't serializable.

Another question (my last!): what is the best way to handle home
interfaces in the delegate? Do you cache them? Do you treat them like a
logger object or a singleton? Or do you just instantiate them fresh

each


call?


Thanks! Adam


On 03/17/2004 09:22 AM HG wrote:



Hi Robert and Adam...

Guess I am paranoid or prepared.. :-)

I use nearly the approach Robert described, using a Factory for the
delegate....although the purpose is not the same..

I use the Delegate as the "web tier view" of the business

logic/services



in


the system. That becomes important, when different business

rules/logic



applies to different modules/plugin.

In my scenario I call the business delegates for business plugins

because of



the dynamic plugable nature. Plugins are hosted by a plugin manager

(the



factory), and access the plugin interfaces always goes through the

plugin



manager.

You get an interface to a plugin (ie. web tier view of a business

service),



not an implementation...that's important as you state correctly

Robert.



The difference is that I don't care if it is a POJO, EJB, whatever I

am



talking to "behing the scenes", I care about HOW the business service

is



implemented...

Let me give you an example:

Way through system is:

Action->Plugin->Facade->Entity

Pseudo code for action execute:
AccountManagement plugin =
pluginManager.getPlugin("core.account.management");

What I get here is an interface (AccountManagement) of a business

service



plugin. Behind the interface, one specific implementation of it

resides.



WHAT implementation to use is decided by the plugin manager. I my

scenario



it is based on a customer, which have a certain business role. But it

can be



whatever logic to decide which implementation to use.

Now I use the the plugin business service interface from my action

plugin.createAccount("001", "Hans Gruber");

With this one call a specific implementation of the Management

interface



is


called. What happens behind the scenes is not important from the

actions



point of view. Maybe different business rules/logic applies for

different



implementations of the AccountManagement.

What actually happens is that the plugin service implementation calls

a



facade to fulfil the business action of creating an account.

This approach is highly flexible...You have the possibility of hosting
different customers (with different needs) under the same application
constrcuted using business plugins building blocks.

It also (like other business delegates as you stated Robert) promotes
loosely coupling between the web tier and EJB or whatever tier is

behind.



With this clean interface it is very very easy to provide an additonal

XML



WebServices interface (maybe though Axis) that makes your business

services



accessible from other platforms, systems, whatever...

My few bucks...Anyone has comments...they are welcome...

Regards

Henrik






----- Original Message ----- From: "Robert Taylor" <[EMAIL PROTECTED]> To: "Struts Users Mailing List" <[EMAIL PROTECTED]> Sent: Wednesday, March 17, 2004 2:51 AM Subject: RE: action - delegate - facade





Adam, IMHO the Business Delegate pattern abstracts the client from

knowing



your business implementation, whether it be EBJ, JDO, POJO, roll your

own.



The



client interfaces with the Business Delegate and not its

implementation.



For example, if you have an Action (client) interface with the

Business



Delegate



instead of directly with a SessionFacade, then you can change the

underlying implementation




of the Business Delegate without changing anything in the client.
If your really paranoid (or prepared), you can use the Abstract

Factory



pattern which you could then



initialize/subclass to create the appropriate Business Delegate

implementations (EJB, JDO, main frame).




Also by using a Business Delegate the client isn't exposed to

implementation details




such as (if your using EJB) looking up the appropropriate EJB or

handling



implementation



specific exceptions. The Business Delegate becomes a high level

abstraction of the




business rules raising application level exceptions when error occur

to



which the client



can respond appropriately.

So, you wouldn't necessarily have to modify the Delegate-Facade

interface.



The interface



itself remains unchanged. You have to use a different implementation.

That



is where the



factory comes in. I imagine you could do something like the

following:


Properties props = // get initialization properties
                // to initialize factory to return EJB BD

implementations




BusinessDelegateFactory bdf = BusinessDelegateFactory.init(props);


In your client, suppose AccountBD is your BusinessDelegate interface:


BusinessDelegateFactory bdf = BusinessDelegateFactory.getInstance();
AccountBD accountBD =

(AccountBD)bdf.createBusinessDelegate(AccountBD.BD_NAME);




So you just end up "plugging" in new implementations as needed.

Anyhow, that's my interpretation of the some of the forces behind the

pattern




and an idea on implementing it.

Here's more information:



http://java.sun.com/blueprints/corej2eepatterns/Patterns/BusinessDelegate.html

http://www.developer.com/java/other/article.php/626001

robert




-----Original Message-----
From: Adam Hardy [mailto:[EMAIL PROTECTED]
Sent: Tuesday, March 16, 2004 6:26 PM
To: Struts Users Mailing List
Subject: action - delegate - facade


I've just been perusing the archive to check out what people have

been



saying about struts to EJB interfacing.

One thing that occurs to me is that the only reason mentioned for

having



a business delegate layer between the Actions and the Session Facade

is



to allow for loose coupling of the struts-dependent code with the

EJB


dependent code.

How necessary is that? If you choose to drop EJB and go with, say
Hibernate, you would have to modify the interface, whether it is the
Action - Facade interface or the Delegate - Facade interface.

Or have I missed an important other reason for the existence of the
Delegate layer?

Adam
--
struts 1.1 + tomcat 5.0.16 + java 1.4.2
Linux 2.4.20 Debian



---------------------------------------------------------------------

To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]




--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]




--
struts 1.1 + tomcat 5.0.16 + java 1.4.2
Linux 2.4.20 Debian


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]




--
struts 1.1 + tomcat 5.0.16 + java 1.4.2
Linux 2.4.20 Debian


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]




--
struts 1.1 + tomcat 5.0.16 + java 1.4.2
Linux 2.4.20 Debian


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to