blob: 0014a3cb727cd3bc19d5af74961a36be76b5ad40 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 Markus Alexander Kuppe.
* 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 Alexander Kuppe (ecf-dev_eclipse.org <at> lemmster <dot> de) - initial API and implementation
******************************************************************************/
package org.eclipse.ecf.remoteservice.ui.dosgi.handlers;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.ecf.discovery.IServiceInfo;
import org.eclipse.ecf.discovery.IServiceProperties;
import org.eclipse.ecf.discovery.ui.DiscoveryHandlerUtil;
import org.eclipse.ecf.internal.remoteservices.ui.Activator;
import org.eclipse.ecf.internal.remoteservices.ui.handlers.ReflectiveRemoteServiceHandler;
import org.eclipse.ecf.osgi.services.discovery.RemoteServicePublication;
import org.eclipse.ecf.osgi.services.discovery.ServicePublication;
import org.eclipse.ecf.osgi.services.distribution.IDistributionConstants;
import org.eclipse.ecf.remoteservice.IRemoteService;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
public class DOSGiReflectiveRemoteServiceHandler extends
ReflectiveRemoteServiceHandler {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands
* .ExecutionEvent)
*/
public Object execute(ExecutionEvent event) throws ExecutionException {
final IServiceInfo serviceInfo = DiscoveryHandlerUtil
.getActiveIServiceInfoChecked(event);
final IServiceProperties serviceProperties = serviceInfo
.getServiceProperties();
final String clazz = serviceProperties
.getPropertyString(ServicePublication.SERVICE_INTERFACE_NAME);
final String serviceId = new String(
serviceProperties
.getPropertyBytes(org.eclipse.ecf.remoteservice.Constants.SERVICE_ID));
final String containerId = new String(
serviceProperties
.getPropertyBytes(RemoteServicePublication.ENDPOINT_CONTAINERID));
// get the service via the osgi service registry
final BundleContext context = Activator.getDefault().getBundle()
.getBundleContext();
final Filter filter;
try {
filter = context.createFilter("(&(" + Constants.OBJECTCLASS + "=" //$NON-NLS-1$ //$NON-NLS-2$
+ clazz + ")" + "(" + IDistributionConstants.SERVICE_IMPORTED + "=*" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ ")" + "(" + ServicePublication.ENDPOINT_ID + "=" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ containerId + "#" + serviceId + "))"); //$NON-NLS-1$ //$NON-NLS-2$
} catch (InvalidSyntaxException e1) {
MessageDialog.openError(null, Messages.DOSGiReflectiveRemoteServiceHandler_HandlerInvocationFailed,
NLS.bind(Messages.DOSGiReflectiveRemoteServiceHandler_FilterCreationFailed, e1.getMessage()));
return null;
}
final ServiceTracker serviceTracker = new ServiceTracker(context,
filter, null);
serviceTracker.open();
final ServiceReference serviceReference = serviceTracker
.getServiceReference();
if (serviceReference == null) {
MessageDialog.openError(null, Messages.DOSGiReflectiveRemoteServiceHandler_HandlerInvocationFailed,
NLS.bind(Messages.DOSGiReflectiveRemoteServiceHandler_NoServiceMatch
,filter.toString()));
return null;
}
// obtain the remote service reference from the local service ref (cool
// ECF feature, huh?)
final IRemoteService remoteService = (IRemoteService) serviceReference
.getProperty(IDistributionConstants.SERVICE_IMPORTED);
if (remoteService == null) {
MessageDialog.openError(null,
Messages.DOSGiReflectiveRemoteServiceHandler_HandlerInvocationFailed, Messages.DOSGiReflectiveRemoteServiceHandler_RemoteServiceUnresolveable);
return null;
}
try {
executeMethodInvocationDialog(Class.forName(clazz), remoteService);
} catch (ClassNotFoundException e) {
MessageDialog.openError(null,
Messages.DOSGiReflectiveRemoteServiceHandler_HandlerInvocationFailed, e.getLocalizedMessage());
throw new ExecutionException(e.getMessage(), e);
}
return null;
}
}