2009/3/19 Pierre De Rop <[email protected]> > 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 ? >
Hi Pierre, You should really open a JIRA issue against DM and attach this patch (remember to tick the box granting a license to the ASF for inclusion) Then Marcel can review it and everything gets tracked properly. -- Thanks in advance, Stuart > Best Regards > /pierre > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] >

