You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@felix.apache.org by Stuart McCulloch <mc...@gmail.com> on 2009/03/19 10:17:56 UTC
Re: Allow DM to inject service properties using a Map
2009/3/19 Pierre De Rop <pi...@alcatel-lucent.fr>
> 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: users-unsubscribe@felix.apache.org
> For additional commands, e-mail: users-help@felix.apache.org
>