You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2014/11/26 23:17:39 UTC
svn commit: r1641954 - in /sling/trunk/testing/mocks/osgi-mock/src:
main/java/org/apache/sling/testing/mock/osgi/
test/java/org/apache/sling/testing/mock/osgi/context/
Author: sseifert
Date: Wed Nov 26 22:17:39 2014
New Revision: 1641954
URL: http://svn.apache.org/r1641954
Log:
SLING-4202 OSGi Mock: Fail-fast when mandatory references cannot be injected
Modified:
sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java
sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java
Modified: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java?rev=1641954&r1=1641953&r2=1641954&view=diff
==============================================================================
--- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java (original)
+++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java Wed Nov 26 22:17:39 2014
@@ -108,7 +108,7 @@ public final class MockOsgi {
* is thrown.
* @param target Service instance
* @param bundleContext Bundle context from which services are fetched to inject.
- * @return true if all dependencies could be injected
+ * @return true if all dependencies could be injected, false if the service has no dependencies.
*/
public static boolean injectServices(Object target, BundleContext bundleContext) {
return ReflectionServiceUtil.injectServices(target, bundleContext);
Modified: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java?rev=1641954&r1=1641953&r2=1641954&view=diff
==============================================================================
--- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java (original)
+++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java Wed Nov 26 22:17:39 2014
@@ -34,8 +34,6 @@ import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.ComponentContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
/**
@@ -43,8 +41,6 @@ import org.w3c.dom.Document;
*/
final class ReflectionServiceUtil {
- private static final Logger log = LoggerFactory.getLogger(ReflectionServiceUtil.class);
-
private ReflectionServiceUtil() {
// static methods only
}
@@ -261,7 +257,7 @@ final class ReflectionServiceUtil {
* multiple references.
* @param target Service instance
* @param bundleContext Bundle context from which services are fetched to inject.
- * @return true if all dependencies could be injected
+ * @return true if all dependencies could be injected, false if the service has no dependencies.
*/
public static boolean injectServices(Object target, BundleContext bundleContext) {
@@ -273,17 +269,18 @@ final class ReflectionServiceUtil {
throw new NoScrMetadataException(targetClass);
}
List<Reference> references = OsgiMetadataUtil.getReferences(targetClass, metadata);
+ if (references.isEmpty()) {
+ return false;
+ }
// try to inject services
- boolean allInjected = true;
for (Reference reference : references) {
- boolean injectSuccess = injectServiceReference(reference, target, bundleContext);
- allInjected = allInjected && injectSuccess;
+ injectServiceReference(reference, target, bundleContext);
}
- return allInjected;
+ return true;
}
- private static boolean injectServiceReference(Reference reference, Object target, BundleContext bundleContext) {
+ private static void injectServiceReference(Reference reference, Object target, BundleContext bundleContext) {
Class<?> targetClass = target.getClass();
// get reference type
@@ -302,18 +299,14 @@ final class ReflectionServiceUtil {
boolean isOptional = (reference.getCardinality() == ReferenceCardinality.OPTIONAL_UNARY || reference
.getCardinality() == ReferenceCardinality.OPTIONAL_MULTIPLE);
if (!isOptional) {
- log.warn("Unable to inject mandatory reference '{}' for class {}", reference.getName(),
- targetClass.getName());
+ throw new RuntimeException("Unable to inject mandatory reference '" + reference.getName() + "' for class " + targetClass.getName());
}
- return isOptional;
}
// multiple references found? check if reference is not multiple
if (matchingServices.size() > 1
&& (reference.getCardinality() == ReferenceCardinality.MANDATORY_UNARY || reference.getCardinality() == ReferenceCardinality.OPTIONAL_UNARY)) {
- log.warn("Multiple matches found for unary reference '{}' for class {}", reference.getName(),
- targetClass.getName());
- return false;
+ throw new RuntimeException("Multiple matches found for unary reference '" + reference.getName() + "' for class "+ targetClass.getName());
}
// try to invoke bind method
@@ -326,7 +319,7 @@ final class ReflectionServiceUtil {
for (ServiceInfo matchingService : matchingServices) {
invokeMethod(target, bindMethod, new Object[] { matchingService.getServiceReference() });
}
- return true;
+ return;
}
// 2. assignable from service instance
@@ -341,7 +334,7 @@ final class ReflectionServiceUtil {
for (ServiceInfo matchingService : matchingServices) {
invokeMethod(target, bindMethod, new Object[] { matchingService.getServiceInstance() });
}
- return true;
+ return;
}
// 3. assignable from service instance plus map
@@ -350,12 +343,12 @@ final class ReflectionServiceUtil {
for (ServiceInfo matchingService : matchingServices) {
invokeMethod(target, bindMethod, new Object[] { matchingService.getServiceInstance(), matchingService.getServiceConfig() });
}
- return true;
+ return;
}
}
- log.warn("Bind method not found for reference '{}' for class {}", reference.getName(), targetClass.getName());
- return false;
+ throw new RuntimeException("Bind method with name " + bindMethodName + " not found "
+ + "for reference '" + reference.getName() + "' for class {}" + targetClass.getName());
}
private static List<ServiceInfo> getMatchingServices(Class<?> type, BundleContext bundleContext) {
Modified: sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java?rev=1641954&r1=1641953&r2=1641954&view=diff
==============================================================================
--- sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java (original)
+++ sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java Wed Nov 26 22:17:39 2014
@@ -21,6 +21,7 @@ package org.apache.sling.testing.mock.os
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.mock;
import java.util.HashMap;
import java.util.HashSet;
@@ -29,6 +30,8 @@ import java.util.Set;
import org.apache.sling.testing.mock.osgi.NoScrMetadataException;
import org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest;
+import org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest.ServiceInterface1;
+import org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest.ServiceInterface2;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -92,6 +95,13 @@ public class OsgiContextImplTest {
@Test
public void testRegisterInjectActivate() {
+ context.registerService(ServiceInterface1.class, mock(ServiceInterface1.class));
+ context.registerService(ServiceInterface2.class, mock(ServiceInterface2.class));
+ context.registerInjectActivateService(new ReflectionServiceUtilTest.Service3());
+ }
+
+ @Test(expected=RuntimeException.class)
+ public void testRegisterInjectActivate_RefrenceMissing() {
context.registerInjectActivateService(new ReflectionServiceUtilTest.Service3());
}