Return-Path: Delivered-To: apmail-jakarta-hivemind-user-archive@www.apache.org Received: (qmail 52304 invoked from network); 7 Oct 2005 07:45:22 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 7 Oct 2005 07:45:22 -0000 Received: (qmail 80899 invoked by uid 500); 7 Oct 2005 07:45:21 -0000 Delivered-To: apmail-jakarta-hivemind-user-archive@jakarta.apache.org Received: (qmail 80655 invoked by uid 500); 7 Oct 2005 07:45:20 -0000 Mailing-List: contact hivemind-user-help@jakarta.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: hivemind-user@jakarta.apache.org List-Id: Delivered-To: mailing list hivemind-user@jakarta.apache.org Received: (qmail 80644 invoked by uid 99); 7 Oct 2005 07:45:20 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 07 Oct 2005 00:45:20 -0700 X-ASF-Spam-Status: No, hits=0.0 required=10.0 tests= X-Spam-Check-By: apache.org Received-SPF: neutral (asf.osuosl.org: local policy) Received: from [213.157.168.226] (HELO mail.netrom.ro) (213.157.168.226) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 07 Oct 2005 00:45:23 -0700 Received: from [127.0.0.1] (andreic.netrom.ro [194.102.98.244]) by mail.netrom.ro (8.11.0/8.9.3) with ESMTP id j975XLI05012 for ; Fri, 7 Oct 2005 08:33:21 +0300 Message-ID: <43462776.5080600@netrom.ro> Date: Fri, 07 Oct 2005 10:44:54 +0300 From: Andrei Chiritescu Reply-To: hivemind-user@jakarta.apache.org User-Agent: Mozilla Thunderbird 1.0.6 (Windows/20050716) X-Accept-Language: en-us, en MIME-Version: 1.0 To: hivemind-user@jakarta.apache.org Subject: Re: injecting sevices References: <434390EC.60107@netrom.ro> <434414BE.4020407@netrom.ro> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Hi Adam, thanks for your the answers, but none of the solution will work for me. In the first case you present something that resembles with inheritance between elements which is not good since I don t what to modify the xml for each new class. At the second case you said : >In *any* class I may write:- >public abstract IPostcodeTO getIPostcodeTO(); When you say "In *any* class" I think mean any Tapestry class (one which extends BasePage or BaseComponent ) which has a IPostcodeTO property. In this case I'm afraid that the IPostcodeTO is not injected by Hivemind in that class (I think Tapestry handles that). However the problem is that my code does not work over a tapestry framework, so.... The problem that I have is very simple (I think) and I would look for a simple solution. I have one service A declared in the xml module. Now I would like to know how to get an instance of any class(at runtime, so the class is not known at compile thus no way to set it in the xml module) which has a setter like "void setA(A a)" to have the service A injected. Here is a more complete code: - as I have said before I have a module declared like(AAA is any given class) : / / - and an interface like: interface BBB { void setAAA(AAA aaa); } - and in another class something like AAA aaa = ... an instance of the AAA class String className= ... provided at run time - the name of a class that implements the BBB interface Class bbbClass; BBB bbbInstance; try{ bbbClass= Thread.currentThread().getContextClassLoader().loadClass( className ); bbbInstance= (BBB ) bbbClass.newInstance(); bbbInstance.setAAA( this ); }catch ( Exception e ) {/*error*/} - What I would like is to replace the code between the try/catch with some hivemind one. So the end result will look like : AAA aaa = ... an instance of the AAA class String className= ... provided at run time - the name of a class that implements the BBB interface Class bbbClass; BBB bbbInstance; try{ bbbClass= Thread.currentThread().getContextClassLoader().loadClass( className ); bbbInstance= hivemindRegistry.getManagedInstance(bbbClass); }catch ( Exception e ) {/*error*/} So, basically, I what hivemind to create the instance and inject an AAA instance into my bbbClass, instead of doing it manually. Does anyone have a practical solution for this? I would appreciate if the solution would be exemplified on the given example :) Thanks for your help, Andrei adasal wrote: > In the application written by Shing Hing Man and myself we have:- > case 1:- > > ognlPathValidate="ognlPath.toCondition.toCheck1.ifPreCon1.aValue" > ognlPathCondition="ognlPath.toPreCondition.toCheck1" > errorMessage="${uniqueMessageID1}" > enumType="@OGNLpath@ENUM"/> > > > > ognlPathValidate="ognlPath.toCondition.toCheck2.ifPreCon2.aValue" > ognlPathCondition="ognlPath.toPreCondition.toCheck2" > errorMessage="${uniqueMessageID2}"/> > but note we are reussing VCompletedDoubleIfBoolean defined in the > schema like this:- > If ognlPathCondition is true, > ognlpathValidate must not be null. Otherwise, there is no > validation on > ognlpathValidate. > An > ErroredDate. > > An > ErroredBoolean. > > > > class="com.pathto.baseclass.usedin.validation.VCompletedDateIfBoolean"/> > > which retrieve the object we are interested in from the object tree, > and retrieves the values we need. > This entails necessary repetition in hivemodule. The issue would be > whether each case defined in hivemodule is really a seperate case. > It does become tedious, and perhaps confussing, to have a large > hivemodule, where many contributions are only subtly different. > > Case 2:- > Where a postcode lookup method in our Tapestry application interfaces > to a third party service we have found that some inputs cause the > service to hang (and, what is worse, would provoke the user to > multiple submits). > This is overcome (in part) by wrappling the calls in a timed window > that snaps shut before lengthy searches are made. > Hivemodule is useful here in setting global timeout properties, > although they shouldn't have to be changed since I have made a series > of emperical tests to determine a minimum window. > This seems to me to be a simple "controller". > > > interface="com.pathTo.search.service.wrapper.api.IPostcodeTO"> > > class="com.pathTo.search.service.wrapper.PostcodeSearchTOImpl"> > > > > > > with impl:- > public class PostcodeSearchTOImpl implements IPostcodeTO { > .............. > } > and interface :- > public interface IPostcodeTO { > public int getIPostcodeSearchTO(); > public void setIPostcodeSearchTO(int globalTimeout); > public boolean isTimedOut(); > > } > > In *any* class I may write:- > public abstract IPostcodeTO getIPostcodeTO(); > ............. > //in this case the calling client method is in our impl of Tapestry > public void updateAddressResults(IRequestCycle cycle) { > ................ > //the value set in hivemodule > IPostcodeTO globalTimeout = getIPostcodeTO(); > > //the value used in this instance can be reset, because it is a time > derived from the system in milliseconds, I start it now > globalTimeout.setIPostcodeSearchTO(globalTimeout.getIPostcodeSearchTO()); > > make calls to object(s).method(s) that use the properties set > ...................... > } > } > The service client is in any class, as usual with private class > instance of the interface type. > > I think that covers what you are refering to? > Adam > > On 10/5/05, *Andrei Chiritescu* > wrote: > > > Contoller will be IController and ControllerImpl. Device will > > implement IController. All that is configured in HiveModule is the > > service defining Controller, it's methods and instantiated > values will > > be available to Device. Is this what you mean? > > Not quite. Let me try to explain my situation better. > I have a module like : > / > > > > > > > / > > and the Controller.class: > /package app; > class Controller > { > /* implementaion is not important */ > } > > and I also have a Device class: > //package app; > class //Device / > / { > private Controller controller; > public void setController( Controller controller ) > { > this.controller = controller; > } > } > / > Now , what I would like is to get a Device instance that will have the > controller injected into it. This without having to add a > / /for the Device into the xml descriptor module. > So, something like this should work(or anything similar) : > Registry registry = .... > Device device = (Device) registry.getService( /Device/.class ); > > Basically I would like that for any given class to get its managed > instance (like the Device class in the example) without needing the > declared. > > Thanks, > Andrei Chiritescu > > > adasal wrote: > > > Contoller will be IController and ControllerImpl. Device will > > implement IController. All that is configured in HiveModule is the > > service defining Controller, it's methods and instantiated > values will > > be available to Device. Is this what you mean? > > Or you can get an instance of the service :- > > Contoller registry.getService("app.IController", > > ControllerImpl..class) > > or do something like this:- > > > > public class XXXEngine extends BaseEngine { > > .................... > > protected Object createGlobal(RequestContext context) { > > HttpServletRequest request = context.getRequest(); > > > > return HiveMindFilter.getRegistry(request); > > } > > used like e.g. this:- > > > > protected void cleanupAfterRequest(IRequestCycle cycle) { > > super.cleanupAfterRequest(cycle); > > > > Registry registry = (Registry) getGlobal(); > > //which allows:- > > ISessionManager sessionManager = (ISessionManager) > > registry.getService(ISessionManager.class); > > > > ......... > > What is being controlled here is access to a single session object, > > but your problems may be similar. > > Tapestry-3.0.3 hivemind-1.0.0 > > Adam > > > > On 10/5/05, *Andrei Chiritescu* > > >> wrote: > > > > Do you know whether hivemind contains a method to get an > instance > > from a > > specific class (given the classname), which then does all the > > autowiring? I would just like to get a class instance based on > > classname, so that an entry in hivemodule is not necessary. > > > > I there a method to get an instance of a specific class > (given the > > fully > > qualified classname) that is managed by Hivemind(has the > services > > injected) without having to add an entry in the hivemodule > > descriptor? > > Basically what I have is a "Controller" service (declared in > the xml > > module) and a lot of Device classes which require the > Controller. > > What I > > want is to get a instance of Device class that has the > Controller > > class > > wired (injected by hivemind) without adding the Device > service in the > > xml descriptor. > > > > Is this possible? > > > > Regards, > > Andrei Chiritescu > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: > > hivemind-user-unsubscribe@jakarta.apache.org > > > > > > For additional commands, e-mail: > > hivemind-user-help@jakarta.apache.org > > > > > > > > > > > --------------------------------------------------------------------- To unsubscribe, e-mail: hivemind-user-unsubscribe@jakarta.apache.org For additional commands, e-mail: hivemind-user-help@jakarta.apache.org