| /******************************************************************************* |
| * Copyright (c) 2009 EclipseSource and others. 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: |
| * EclipseSource - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.ecf.remoteservice; |
| |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.ecf.core.ContainerConnectException; |
| import org.eclipse.ecf.core.IContainer; |
| import org.eclipse.ecf.core.identity.ID; |
| import org.eclipse.ecf.core.identity.IDFactory; |
| import org.osgi.framework.InvalidSyntaxException; |
| |
| /** |
| * @since 3.0 |
| */ |
| public class RemoteServiceContainer implements IRemoteServiceContainer { |
| |
| private final IContainer container; |
| private final IRemoteServiceContainerAdapter containerAdapter; |
| |
| public RemoteServiceContainer(IContainer container, IRemoteServiceContainerAdapter containerAdapter) { |
| Assert.isNotNull(container); |
| Assert.isNotNull(containerAdapter); |
| this.container = container; |
| this.containerAdapter = containerAdapter; |
| } |
| |
| /** |
| * @since 3.2 |
| * @param container container |
| */ |
| @SuppressWarnings("cast") |
| public RemoteServiceContainer(IContainer container) { |
| this(container, (IRemoteServiceContainerAdapter) container.getAdapter(IRemoteServiceContainerAdapter.class)); |
| } |
| |
| public IContainer getContainer() { |
| return container; |
| } |
| |
| public IRemoteServiceContainerAdapter getContainerAdapter() { |
| return containerAdapter; |
| } |
| |
| public IRemoteService getRemoteService(String targetLocation, String serviceInterfaceClass, String filter) throws ContainerConnectException, InvalidSyntaxException { |
| ID targetID = null; |
| if (targetLocation != null) { |
| targetID = IDFactory.getDefault().createID(getContainer().getConnectNamespace(), targetLocation); |
| } |
| IRemoteServiceReference serviceReference = getServiceReference(targetID, serviceInterfaceClass, filter); |
| if (serviceReference == null) |
| return null; |
| return getContainerAdapter().getRemoteService(serviceReference); |
| } |
| |
| protected IRemoteServiceReference getServiceReference(ID targetId, String serviceInterfaceClass, String filter) throws ContainerConnectException, InvalidSyntaxException { |
| IRemoteServiceReference[] references = getContainerAdapter().getRemoteServiceReferences(targetId, serviceInterfaceClass, filter); |
| if (references == null || references.length == 0) |
| return null; |
| return selectReference(references); |
| } |
| |
| protected IRemoteServiceReference selectReference(IRemoteServiceReference[] references) { |
| int length = (references == null) ? 0 : references.length; |
| if (length == 0) { /* if no service is being tracked */ |
| return null; |
| } |
| int index = 0; |
| if (length > 1) { /* if more than one service, select highest ranking */ |
| int rankings[] = new int[length]; |
| int count = 0; |
| int maxRanking = Integer.MIN_VALUE; |
| for (int i = 0; i < length; i++) { |
| Object property = references[i].getProperty(org.eclipse.ecf.remoteservice.Constants.SERVICE_RANKING); |
| int ranking = (property instanceof Integer) ? ((Integer) property).intValue() : 0; |
| rankings[i] = ranking; |
| if (ranking > maxRanking) { |
| index = i; |
| maxRanking = ranking; |
| count = 1; |
| } else { |
| if (ranking == maxRanking) { |
| count++; |
| } |
| } |
| } |
| if (count > 1) { /* if still more than one service, select lowest id */ |
| long minId = Long.MAX_VALUE; |
| for (int i = 0; i < length; i++) { |
| if (rankings[i] == maxRanking) { |
| long id = ((Long) (references[i].getProperty(org.eclipse.ecf.remoteservice.Constants.SERVICE_ID))).longValue(); |
| if (id < minId) { |
| index = i; |
| minId = id; |
| } |
| } |
| } |
| } |
| } |
| return references[index]; |
| } |
| |
| public IRemoteService getRemoteService(String targetLocation, String serviceInterfaceClass) throws ContainerConnectException { |
| try { |
| return getRemoteService(targetLocation, serviceInterfaceClass, null); |
| } catch (InvalidSyntaxException e) { |
| // Cannot happen |
| return null; |
| } |
| } |
| |
| public IRemoteService getRemoteService(String serviceInterfaceClass) { |
| try { |
| return getRemoteService(null, serviceInterfaceClass); |
| } catch (ContainerConnectException e) { |
| // if targetLocation is null, cannot happen |
| return null; |
| } |
| } |
| |
| public String toString() { |
| StringBuffer buffer = new StringBuffer(); |
| buffer.append("RemoteServiceContainer [containerID="); //$NON-NLS-1$ |
| buffer.append(container.getID()); |
| buffer.append(", container="); //$NON-NLS-1$ |
| buffer.append(container); |
| buffer.append(", containerAdapter="); //$NON-NLS-1$ |
| buffer.append(containerAdapter); |
| buffer.append("]"); //$NON-NLS-1$ |
| return buffer.toString(); |
| } |
| |
| } |