From 101150268730e7400354c972ad09eec6d3de1bfc Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Fri, 12 Jun 2015 14:19:29 -0400 Subject: Bug 317173 - Better use of generics Change-Id: I19319f85219db677328d9fc35574f07ca84a3752 Signed-off-by: Marc Khouzam --- .../cdt/dsf/service/DsfServicesTracker.java | 46 +++++++++++++--------- 1 file changed, 27 insertions(+), 19 deletions(-) (limited to 'dsf') diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/service/DsfServicesTracker.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/service/DsfServicesTracker.java index d817e7d0164..3eb3da8c692 100644 --- a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/service/DsfServicesTracker.java +++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/service/DsfServicesTracker.java @@ -11,6 +11,7 @@ *******************************************************************************/ package org.eclipse.cdt.dsf.service; +import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -91,8 +92,8 @@ public class DsfServicesTracker { private final String fSessionId; private volatile boolean fDisposed = false; private final BundleContext fBundleContext; - private final Map> fServiceReferences = new HashMap>(); - private final Map,Object> fServices = new HashMap,Object>(); + private final Map> fServiceReferences = new HashMap<>(); + private final Map,Object> fServices = new HashMap<>(); private final String fServiceFilter; private final ServiceListener fListner = new ServiceListener() { @@ -166,7 +167,7 @@ public class DsfServicesTracker { * session-ID * @return OSGI service reference object to the desired service, null if not found */ - public ServiceReference getServiceReference(Class serviceClass, String filter) { + public ServiceReference getServiceReference(Class serviceClass, String filter) { if (fDisposed) { return null; } @@ -180,17 +181,20 @@ public class DsfServicesTracker { ServiceKey key = new ServiceKey(serviceClass, filter != null ? filter : fServiceFilter); if (fServiceReferences.containsKey(key)) { - return fServiceReferences.get(key); + @SuppressWarnings("unchecked") + ServiceReference ref = (ServiceReference)fServiceReferences.get(key); + return ref; } try { - ServiceReference[] references = fBundleContext.getServiceReferences(key.fClassName, key.fFilter); - assert references == null || references.length <= 1; - if (references == null || references.length == 0) { + Collection> references = fBundleContext.getServiceReferences(serviceClass, key.fFilter); + assert references == null || references.size() <= 1; + if (references == null || references.isEmpty()) { return null; } else { - fServiceReferences.put(key, references[0]); - return references[0]; + ServiceReference ref = references.iterator().next(); + fServiceReferences.put(key, ref); + return ref; } } catch(InvalidSyntaxException e) { assert false : "Invalid session ID syntax"; //$NON-NLS-1$ @@ -219,20 +223,24 @@ public class DsfServicesTracker { * session-ID * @return instance of the desired service, null if not found */ - @SuppressWarnings("unchecked") public V getService(Class serviceClass, String filter) { - ServiceReference serviceRef = getServiceReference(serviceClass, filter); + ServiceReference serviceRef = getServiceReference(serviceClass, filter); if (serviceRef == null) { return null; - } else { - if (fServices.containsKey(serviceRef)) { - return (V)fServices.get(serviceRef); - } else { - V service = (V)fBundleContext.getService(serviceRef); - fServices.put(serviceRef, service); - return service; - } } + + @SuppressWarnings("unchecked") + V service = (V)fServices.get(serviceRef); + if (service == null) { + // Check to see if 'null' means we never fetched the + // service, or if there simply is none. + // If we never fetched it, do so now and store the result. + if (!fServices.containsKey(serviceRef)) { + service = fBundleContext.getService(serviceRef); + fServices.put(serviceRef, service); + } + } + return service; } /** -- cgit v1.2.3