Marcel,
Sorry for answering so late; I was away for a week.
Thank you so much for the great work, i tried the latest trunk version
and your sample and everything seems to work great :)
Indeed, I must also have been confused at some point by the NullObject
issue and the fact that dependencies are optional by default.
And, promess, i won't argue that setInterface is a bad name! Actually,
even though it can be a class, in this context it represents the
contract we'll be using with the implementation, ie it's interface.
Thanks again,
Arjun
Marcel Offermans wrote:
On Sep 19, 2008, at 17:12 , Arjun Panday wrote:
Simply to make sure there's no confusion..
I agree that the possibility to override the default implementation
is a plus and I'm glad to see you're actively working on it.
Yet my original concern was the ability to give a (non-interface)
class (typically a superclass of the service to bind) as argument to
the setInterface() method.
If I understand you correctly, this is what you want to do:
public class Activator extends DependencyActivatorBase {
public void init(BundleContext context, DependencyManager manager)
throws Exception {
manager.add(createService()
.setInterface(A.class.getName(), null)
.setImplementation(new B())
);
}
public void destroy(BundleContext context, DependencyManager
manager) throws Exception {
}
}
abstract class A {
}
class B extends A {
public void start() {
System.out.println("B started");
}
}
You can argue that setInterface() might not be the best name for the
method in this case. :)
In my example I was trying to express dependency on a ClassLoader,
and expected to be injected with an object implementing a subclass of
ClassLoader. My point was not to provide a default implementation for
this dependency.
Okay. That would make the example something like this (all rolled into
one bundle to keep the example short, different options explained in
comments, use only one at the same time):
public class Activator extends DependencyActivatorBase {
public void init(BundleContext context, DependencyManager manager)
throws Exception {
manager.add(createService()
.setInterface(A.class.getName(), null)
.setImplementation(new B())
);
manager.add(createService()
.setImplementation(new C())
.add(createServiceDependency()
.setService(A.class)
// option 1) the dependency is required, and we want
it injected
.setRequired(true)
// option 2) the dependency is optional, and we want
it injected
.setRequired(false)
.setDefaultImplementation(new A() { /* my default impl
*/ })
// option 3) the dependency is optional, and we use
callbacks
.setRequired(false)
.setAutoConfig(false)
.setCallbacks("add", "remove")
)
);
}
public void destroy(BundleContext context, DependencyManager
manager) throws Exception {
}
}
abstract class A {
}
class B extends A {
public void start() {
System.out.println("B started");
}
}
class C {
volatile A member;
public void start() {
System.out.println("C started");
}
// callbacks for option 3)
public void add(A object) {
System.out.println("adding A");
}
public void remove(A object) {
}
}
Hope this helps.
Greetings, Marcel
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]