| /******************************************************************************* |
| * Copyright (c) 2008 Versant Corp. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Markus Kuppe (mkuppe <at> versant <dot> com) - initial API and implementation |
| ******************************************************************************/ |
| |
| package org.eclipse.ecf.internal.remoteservices.ui; |
| |
| import org.eclipse.core.commands.ExecutionEvent; |
| import org.eclipse.core.commands.ExecutionException; |
| import org.eclipse.ecf.core.ContainerCreateException; |
| import org.eclipse.ecf.core.ContainerFactory; |
| import org.eclipse.ecf.core.IContainer; |
| import org.eclipse.ecf.core.IContainerManager; |
| import org.eclipse.ecf.core.identity.ID; |
| import org.eclipse.ecf.core.identity.IDCreateException; |
| import org.eclipse.ecf.core.identity.IDFactory; |
| import org.eclipse.ecf.discovery.IServiceInfo; |
| import org.eclipse.ecf.discovery.ui.DiscoveryHandlerUtil; |
| import org.eclipse.ecf.osgi.services.remoteserviceadmin.RemoteConstants; |
| import org.eclipse.ecf.remoteservice.IRemoteServiceContainerAdapter; |
| import org.eclipse.ecf.remoteservice.IRemoteServiceReference; |
| import org.osgi.framework.InvalidSyntaxException; |
| |
| public class RemoteServiceHandlerUtil { |
| |
| public static IRemoteServiceContainerAdapter getActiveIRemoteServiceContainerAdapterChecked(ExecutionEvent event) |
| throws ExecutionException { |
| final ID activeConnectId = getActiveConnectIDChecked(event); |
| final IContainer container = getContainerWithConnectID(activeConnectId); |
| if (container == null) { |
| return null; |
| } |
| final IRemoteServiceContainerAdapter adapter = (IRemoteServiceContainerAdapter) container |
| .getAdapter(IRemoteServiceContainerAdapter.class); |
| return adapter; |
| } |
| |
| public static IRemoteServiceReference[] getActiveIRemoteServiceReferencesChecked(ExecutionEvent event) |
| throws ExecutionException { |
| final IServiceInfo serviceInfo = DiscoveryHandlerUtil.getActiveIServiceInfoChecked(event); |
| final IRemoteServiceContainerAdapter adapter = getActiveIRemoteServiceContainerAdapterChecked(event); |
| try { |
| return getRemoteServiceReferencesForRemoteServiceAdapter(adapter, serviceInfo); |
| } catch (IDCreateException e) { |
| throw new ExecutionException(e.getMessage(), e); |
| } catch (InvalidSyntaxException e) { |
| throw new ExecutionException(e.getMessage(), e); |
| } |
| } |
| |
| public static ID getActiveConnectIDChecked(ExecutionEvent event) throws ExecutionException { |
| final IServiceInfo serviceInfo = DiscoveryHandlerUtil.getActiveIServiceInfoChecked(event); |
| final String connectNamespace = getConnectNamespace(serviceInfo); |
| final String connectId = getConnectID(serviceInfo); |
| try { |
| return IDFactory.getDefault().createID(connectNamespace, connectId); |
| } catch (IDCreateException e) { |
| throw new ExecutionException(e.getMessage(), e); |
| } |
| } |
| |
| public static IContainer getActiveIRemoteServiceContainerChecked(ExecutionEvent event) throws ExecutionException { |
| final IServiceInfo serviceInfo = DiscoveryHandlerUtil.getActiveIServiceInfoChecked(event); |
| final ID createConnectId = getActiveConnectIDChecked(event); |
| final IContainer container = getContainerWithConnectID(createConnectId); |
| if (container != null) { |
| return container; |
| } |
| // TODO remove parameters once |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=256586 is fixed |
| final Object[] parameters = new Object[] { createConnectId }; |
| try { |
| // If it's not there and already connected then create and return |
| // new one |
| return ContainerFactory.getDefault().createContainer(getContainerFactory(serviceInfo), parameters); |
| } catch (ContainerCreateException e) { |
| throw new ExecutionException(e.getMessage(), e); |
| } |
| } |
| |
| // TODO push this functionality down into the ContainerManager |
| private static IContainer getContainerWithConnectID(ID aConnectedID) { |
| final IContainerManager containerManager = Activator.getDefault().getContainerManager(); |
| final IContainer[] containers = containerManager.getAllContainers(); |
| if (containers == null) { |
| return null; |
| } |
| for (int i = 0; i < containers.length; i++) { |
| ID connectedId = containers[i].getConnectedID(); |
| if (connectedId != null && connectedId.equals(aConnectedID)) { |
| return containers[i]; |
| } |
| } |
| return null; |
| } |
| |
| private static IRemoteServiceReference[] getRemoteServiceReferencesForRemoteServiceAdapter( |
| IRemoteServiceContainerAdapter adapter, IServiceInfo serviceInfo) |
| throws InvalidSyntaxException, IDCreateException { |
| ID serviceID = null; |
| final String serviceNamespace = getServiceNamespace(serviceInfo); |
| final String serviceid = getServiceID(serviceInfo); |
| if (serviceNamespace != null && serviceid != null) { |
| serviceID = IDFactory.getDefault().createID(serviceNamespace, serviceid); |
| } |
| final ID[] targets = (serviceID == null) ? null : new ID[] { serviceID }; |
| return adapter.getRemoteServiceReferences(targets, getRemoteServiceClass(serviceInfo), null); |
| } |
| |
| private static String getServiceNamespace(IServiceInfo serviceInfo) { |
| return serviceInfo.getServiceProperties().getPropertyString(RemoteConstants.ENDPOINT_CONTAINER_ID_NAMESPACE); |
| } |
| |
| private static String getServiceID(IServiceInfo serviceInfo) { |
| return serviceInfo.getServiceProperties().getPropertyString(RemoteConstants.ENDPOINT_ID); |
| } |
| |
| private static String getRemoteServiceClass(IServiceInfo serviceInfo) { |
| return serviceInfo.getServiceProperties().getPropertyString(org.osgi.framework.Constants.OBJECTCLASS); |
| } |
| |
| private static String getConnectNamespace(IServiceInfo serviceInfo) { |
| return serviceInfo.getServiceProperties().getPropertyString(RemoteConstants.ENDPOINT_CONTAINER_ID_NAMESPACE); |
| } |
| |
| private static String getConnectID(IServiceInfo serviceInfo) { |
| return serviceInfo.getServiceProperties().getPropertyString(RemoteConstants.ENDPOINT_CONNECTTARGET_ID); |
| } |
| |
| // XXX FIX...this has to use proper container factory type. |
| private static String getContainerFactory(IServiceInfo serviceInfo) { |
| return serviceInfo.getServiceProperties() |
| .getPropertyString(org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_IMPORTED_CONFIGS); |
| } |
| } |