diff options
3 files changed, 58 insertions, 4 deletions
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/serviceregistry/ServiceRegistryTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/serviceregistry/ServiceRegistryTests.java index 49afd98e5..2e4a99f62 100644 --- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/serviceregistry/ServiceRegistryTests.java +++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/serviceregistry/ServiceRegistryTests.java @@ -17,12 +17,22 @@ import java.util.Dictionary; import java.util.Hashtable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.osgi.tests.OSGiTestsActivator; import org.eclipse.osgi.tests.bundles.AbstractBundleTests; import org.eclipse.osgi.tests.util.MapDictionary; -import org.osgi.framework.*; +import org.osgi.framework.Bundle; +import org.osgi.framework.Constants; +import org.osgi.framework.FrameworkEvent; +import org.osgi.framework.FrameworkListener; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceEvent; +import org.osgi.framework.ServiceFactory; +import org.osgi.framework.ServiceListener; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; public class ServiceRegistryTests extends AbstractBundleTests { public static Test suite() { @@ -532,6 +542,42 @@ public class ServiceRegistryTests extends AbstractBundleTests { } } + public void testWrongServiceFactoryObject() throws InterruptedException { + AtomicReference<String> errorMsg = new AtomicReference<>(); + CountDownLatch gotEvent = new CountDownLatch(1); + FrameworkListener fwkListener = (e) -> { + if (e.getType() == FrameworkEvent.ERROR && e.getThrowable() != null) { + errorMsg.set(e.getThrowable().getMessage()); + gotEvent.countDown(); + } + }; + ServiceRegistration<Runnable> reg = OSGiTestsActivator.getContext().registerService(Runnable.class, + new ServiceFactory() { + + @Override + public Object getService(Bundle bundle, ServiceRegistration registration) { + return "Wrong object!!"; + } + + @Override + public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) { + } + + }, null); + OSGiTestsActivator.getContext().addFrameworkListener(fwkListener); + try { + ServiceReference<Runnable> ref = reg.getReference(); + Runnable service = OSGiTestsActivator.getContext().getService(ref); + assertNull(service); + gotEvent.await(30, TimeUnit.SECONDS); + assertNotNull(errorMsg.get()); + assertTrue("Wrong error message: " + errorMsg.get(), errorMsg.get().contains(String.class.getName())); + } finally { + OSGiTestsActivator.getContext().removeFrameworkListener(fwkListener); + reg.unregister(); + } + } + private void clearResults(boolean[] results) { for (int i = 0; i < results.length; i++) results[i] = false; diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/serviceregistry/ServiceFactoryUse.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/serviceregistry/ServiceFactoryUse.java index 374ee21f3..eb441dea5 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/serviceregistry/ServiceFactoryUse.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/serviceregistry/ServiceFactoryUse.java @@ -20,7 +20,11 @@ import org.eclipse.osgi.internal.debug.Debug; import org.eclipse.osgi.internal.framework.BundleContextImpl; import org.eclipse.osgi.internal.messages.Msg; import org.eclipse.osgi.util.NLS; -import org.osgi.framework.*; +import org.osgi.framework.Bundle; +import org.osgi.framework.FrameworkEvent; +import org.osgi.framework.ServiceException; +import org.osgi.framework.ServiceFactory; +import org.osgi.framework.ServiceRegistration; /** * This class represents the use of a service by a bundle. One is created for each @@ -239,7 +243,11 @@ public class ServiceFactoryUse<S> extends ServiceUse<S> { if (debug.DEBUG_SERVICES) { Debug.println("Service object is not an instanceof " + invalidService); //$NON-NLS-1$ } - ServiceException se = new ServiceException(NLS.bind(Msg.SERVICE_FACTORY_NOT_INSTANCEOF_CLASS_EXCEPTION, factory.getClass().getName(), invalidService), ServiceException.FACTORY_ERROR); + ServiceException se = new ServiceException( + NLS.bind(Msg.SERVICE_FACTORY_NOT_INSTANCEOF_CLASS_EXCEPTION, + new Object[] { factory.getClass().getName(), service.getClass().getName(), + invalidService }), + ServiceException.FACTORY_ERROR); context.getContainer().getEventPublisher().publishFrameworkEvent(FrameworkEvent.ERROR, registration.getBundle(), se); return null; } diff --git a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/internal/messages/ExternalMessages.properties b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/internal/messages/ExternalMessages.properties index d3b57bdb1..9b5cdfb45 100644 --- a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/internal/messages/ExternalMessages.properties +++ b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/internal/messages/ExternalMessages.properties @@ -23,7 +23,7 @@ MANIFEST_IOEXCEPTION=An error occurred while reading the manifest file. SERVICE_FACTORY_EXCEPTION=Exception in {0}.{1}() SERVICE_FACTORY_RECURSION=Recursive ServiceFactory call in {0}.{1}() SERVICE_NOT_INSTANCEOF_CLASS_EXCEPTION=The service object is not an instance of the service class {0} -SERVICE_FACTORY_NOT_INSTANCEOF_CLASS_EXCEPTION={0}.getService() returned a service object that is not an instance of the service class {1} +SERVICE_FACTORY_NOT_INSTANCEOF_CLASS_EXCEPTION={0}.getService() returned a service object of type {1} that is not an instance of the service class {2} SERVICE_OBJECT_NULL_EXCEPTION={0}.getService() returned a null service object SERVICE_ARGUMENT_NULL_EXCEPTION=The service parameter is null SERVICE_OBJECTS_UNGET_ARGUMENT_EXCEPTION=The service parameter was not provided by this object |