Hi everyone,
This mail is most likely for Marcel and propose to improve
DependencyManager in the following way:
Currently, when injecting dependencies with callbacks, DM searches for
method signatures in this order:
1. ServiceReference, TheService
2. ServiceReference, Object
3. ServiceReference
4. TheService
5. Object
6. (void)
I propose to add the following signature, which provides service
properties wrapped behing a basic Map:
7. (Map, TheService)
The purpose of this modification is to be able to inject service
properties without coupling my POJOs
with the OSGi API (that is: ServiceReference class, and
ServiceReference.getProperty method).
I think the following patch (applicable in ServiceDependency.java) will
do the trick:
private void invokeCallbackMethod(Object instance, String methodName,
ServiceReference reference, Object service) throws NoSuchMethodException {
Class currentClazz = instance.getClass();
boolean done = false;
while (!done && currentClazz != null) {
Class trackedServiceName;
synchronized (this) {
trackedServiceName = m_trackedServiceName;
}
done = invokeMethod(instance, currentClazz, methodName,
new Class[][] {{ServiceReference.class, trackedServiceName},
{ServiceReference.class, Object.class},
{ServiceReference.class}, {trackedServiceName},
{Object.class},
{Map.class, trackedServiceName},
{}},
new Object[][] {{reference, service},
{reference, service},
{reference},
{service},
{service},
{new ServicePropertiesMap(reference), service},
{}},
false);
if (!done) {
currentClazz = currentClazz.getSuperclass();
}
}
if (!done && currentClazz == null) {
throw new NoSuchMethodException(methodName);
}
}
And here is the Map that wraps the ServiceReference properties:
static class ServicePropertiesMap extends AbstractMap {
private ServiceReference _ref;
public ServicePropertiesMap(ServiceReference ref) {
_ref = ref;
}
public Object get(Object key) { return
_ref.getProperty(key.toString()); }
public int size() { return _ref.getPropertyKeys().length; }
public Set entrySet() {
Set set = new HashSet();
String[] keys = _ref.getPropertyKeys();
for(int i = 0; i < keys.length; i++) {
set.add(new ServicePropertiesMapEntry(keys[i],
_ref.getProperty(keys[i])));
}
return set;
}
}
static class ServicePropertiesMapEntry implements Map.Entry {
String key;
Object value;
public ServicePropertiesMapEntry(String key, Object value) {
this.key = key;
this.value = value;
}
public Object getKey() { return key; }
public Object getValue() { return value; }
public String toString() { return key + "=" + value; }
public Object setValue(Object value) {
Object oldValue = this.value;
this.value = value;
return oldValue;
}
public boolean equals(Object o) {
if (!(o instanceof Map.Entry))
return false;
Map.Entry e = (Map.Entry)o;
return eq(key, e.getKey()) && eq(value, e.getValue());
}
public int hashCode() {
return ((key == null) ? 0 : key.hashCode()) ^
((value == null) ? 0 : value.hashCode());
}
private static boolean eq(Object o1, Object o2) {
return (o1 == null ? o2 == null : o1.equals(o2));
}
}
-> Marcel ? are you ok to add this patch in DM ?
Best Regards
/pierre
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]