Actually this is a pattern mentioned in "EJB Design Patterns - Advanced Patterns 
Processes and Idioms"
called Data Transfer HashMap. You can download the pdf from TheServerSide.com. It's a 
pretty good read.
The book goes into detail on the pros and cons of this pattern.

http://www.theserverside.com/books/wiley/EJBDesignPatterns/downloads/ejbdesignpatterns.pdf


robert
> -----Original Message-----
> From: Adam Hardy [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, March 17, 2004 4:00 PM
> To: Struts Users Mailing List
> Subject: Re: action - delegate - facade
> 
> 
> 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]
> 

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

Reply via email to