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]

Reply via email to