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) :
/<module id="app" version="1.0.0" package="app">
<service-point id="AAA" interface="app.AAA">
<invoke-factory model="singleton">
<construct class="app.AAA"/>
</invoke-factory>
</service-point>
</module>/
- 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:-
<VCompletedBooleanIfInList
ognlPathValidate="ognlPath.toCondition.toCheck1.ifPreCon1.aValue"
ognlPathCondition="ognlPath.toPreCondition.toCheck1"
errorMessage="${uniqueMessageID1}"
enumType="@[EMAIL PROTECTED]"/>
<VCompletedDoubleIfBoolean
ognlPathValidate="ognlPath.toCondition.toCheck2.ifPreCon2.aValue"
ognlPathCondition="ognlPath.toPreCondition.toCheck2"
errorMessage="${uniqueMessageID2}"/>
but note we are reussing VCompletedDoubleIfBoolean defined in the
schema like this:-
<element name="VCompletedDateIfBoolean"> If ognlPathCondition is true,
ognlpathValidate must not be null. Otherwise, there is no
validation on
ognlpathValidate.
<attribute name="ognlPathValidate" required="true"> An
ErroredDate.
</attribute>
<attribute name="ognlPathCondition" required="true"> An
ErroredBoolean.
</attribute>
<attribute name="errorMessage" required="true"/>
<conversion
class="com.pathto.baseclass.usedin.validation.VCompletedDateIfBoolean"/>
</element>
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".
<!-- Threaded service to timeout when large searches are made with
incomplete data. model="threaded" -->
<service-point id="IPostcodeSearchTO"
interface="com.pathTo.search.service.wrapper.api.IPostcodeTO">
<invoke-factory model="threaded">
<construct
class="com.pathTo.search.service.wrapper.PostcodeSearchTOImpl">
<set property="globalTimeout" value="4"/>
</construct>
</invoke-factory>
</service-point>
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* <[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>> 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 :
/<module id="app" version="1.0.0" package="app">
<service-point id="Controller" interface="app.Controller">
<invoke-factory model="singleton">
<construct class="app.Controller"/>
</invoke-factory>
<interceptor service-id="hivemind.LoggingInterceptor"/>
</service-point>
</module>/
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
/<service-point/> /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
<service-point> 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* <[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>
> <mailto: [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>>> 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:
> [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>
> <mailto: [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>>
> For additional commands, e-mail:
> [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>
> <mailto: [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]