diff --git a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java index 7ad58638da6..2b02780ac6e 100644 --- a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java +++ b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java @@ -148,29 +148,33 @@ public class RemoteConnectionType implements IRemoteConnectionType { * @see org.eclipse.remote.core.IRemoteConnectionType#getService(java.lang.Class) */ @Override - public T getService(Class service) { - @SuppressWarnings("unchecked") - T obj = (T) serviceMap.get(service); - if (obj == null) { - IConfigurationElement ce = serviceDefinitionMap.get(service.getName()); - if (ce != null) { - try { - Service.Factory factory = (Service.Factory) ce.createExecutableExtension("factory"); //$NON-NLS-1$ - if (factory != null) { - obj = factory.getService(this, service); - serviceMap.put(service, obj); + public T getService(Class service) { + synchronized (serviceDefinitionMap) { + @SuppressWarnings("unchecked") + T obj = (T) serviceMap.get(service); + if (obj == null) { + IConfigurationElement ce = serviceDefinitionMap.get(service.getName()); + if (ce != null) { + try { + Service.Factory factory = (Service.Factory) ce.createExecutableExtension("factory"); //$NON-NLS-1$ + if (factory != null) { + obj = factory.getService(this, service); + serviceMap.put(service, obj); + } + } catch (CoreException e) { + RemoteCorePlugin.log(e.getStatus()); } - } catch (CoreException e) { - RemoteCorePlugin.log(e.getStatus()); } } + return obj; } - return obj; } @Override public List getServices() { - return new ArrayList<>(serviceDefinitionMap.keySet()); + synchronized (serviceDefinitionMap) { + return new ArrayList<>(serviceDefinitionMap.keySet()); + } } /* @@ -180,7 +184,9 @@ public class RemoteConnectionType implements IRemoteConnectionType { */ @Override public boolean hasService(Class service) { - return serviceDefinitionMap.get(service.getName()) != null; + synchronized (serviceDefinitionMap) { + return serviceDefinitionMap.get(service.getName()) != null; + } } /** @@ -194,25 +200,28 @@ public class RemoteConnectionType implements IRemoteConnectionType { * @throws CoreException */ public T getConnectionService(IRemoteConnection connection, Class service) { - IConfigurationElement ce = connectionServiceDefinitionMap.get(service.getName()); - if (ce != null) { - try { - IRemoteConnection.Service.Factory factory = (IRemoteConnection.Service.Factory) ce - .createExecutableExtension("factory"); //$NON-NLS-1$ - if (factory != null) { - return factory.getService(connection, service); + synchronized (connectionServiceDefinitionMap) { + IConfigurationElement ce = connectionServiceDefinitionMap.get(service.getName()); + if (ce != null) { + try { + IRemoteConnection.Service.Factory factory = (IRemoteConnection.Service.Factory) ce + .createExecutableExtension("factory"); //$NON-NLS-1$ + if (factory != null) { + return factory.getService(connection, service); + } + } catch (CoreException e) { + RemoteCorePlugin.log(e.getStatus()); } - } catch (CoreException e) { - RemoteCorePlugin.log(e.getStatus()); } + return null; } - - return null; } @Override public List getConnectionServices() { - return new ArrayList<>(connectionServiceDefinitionMap.keySet()); + synchronized (connectionServiceDefinitionMap) { + return new ArrayList<>(connectionServiceDefinitionMap.keySet()); + } } /* @@ -222,7 +231,9 @@ public class RemoteConnectionType implements IRemoteConnectionType { */ @Override public boolean hasConnectionService(Class service) { - return connectionServiceDefinitionMap.get(service.getName()) != null; + synchronized (connectionServiceDefinitionMap) { + return connectionServiceDefinitionMap.get(service.getName()) != null; + } } /** @@ -236,24 +247,27 @@ public class RemoteConnectionType implements IRemoteConnectionType { * @throws CoreException */ public T getProcessService(IRemoteProcess process, Class service) { - IConfigurationElement ce = processServiceDefinitionMap.get(service.getName()); - if (ce != null) { - try { - IRemoteProcess.Service.Factory factory = (IRemoteProcess.Service.Factory) ce.createExecutableExtension("factory"); //$NON-NLS-1$ - if (factory != null) { - return factory.getService(process, service); + synchronized (processServiceDefinitionMap) { + IConfigurationElement ce = processServiceDefinitionMap.get(service.getName()); + if (ce != null) { + try { + IRemoteProcess.Service.Factory factory = (IRemoteProcess.Service.Factory) ce.createExecutableExtension("factory"); //$NON-NLS-1$ + if (factory != null) { + return factory.getService(process, service); + } + } catch (CoreException e) { + RemoteCorePlugin.log(e.getStatus()); } - } catch (CoreException e) { - RemoteCorePlugin.log(e.getStatus()); } + return null; } - - return null; } @Override public List getProcessServices() { - return new ArrayList<>(processServiceDefinitionMap.keySet()); + synchronized (processServiceDefinitionMap) { + return new ArrayList<>(processServiceDefinitionMap.keySet()); + } } /* @@ -263,7 +277,9 @@ public class RemoteConnectionType implements IRemoteConnectionType { */ @Override public boolean hasProcessService(Class service) { - return processServiceDefinitionMap.get(service.getName()) != null; + synchronized (processServiceDefinitionMap) { + return processServiceDefinitionMap.get(service.getName()) != null; + } } /** @@ -301,7 +317,7 @@ public class RemoteConnectionType implements IRemoteConnectionType { } /** - * Signal a connnection is about to be removed. + * Signal a connection is about to be removed. * * @since 2.0 */