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]