This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.models.impl-1.0.2 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-impl.git
commit 53a6c314c6b9595f8776360164f0fa2b5b22d3d6 Author: Justin Edelson <jus...@apache.org> AuthorDate: Mon Mar 3 17:58:16 2014 +0000 SLING-3429 - fix NPE in OSGiServiceInjector which impacted multi-valued properties git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/models/impl@1573637 13f79535-47bb-0310-9956-ffa450edef68 --- .../models/impl/injectors/OSGiServiceInjector.java | 6 ++++ .../sling/models/impl/OSGiInjectionTest.java | 25 ++++++++++++++ .../testmodels/classes/OptionalArrayOSGiModel.java | 36 ++++++++++++++++++++ .../testmodels/classes/OptionalListOSGiModel.java | 38 ++++++++++++++++++++++ 4 files changed, 105 insertions(+) diff --git a/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java index 78a73bb..59a9636 100644 --- a/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java +++ b/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java @@ -148,6 +148,9 @@ public class OSGiServiceInjector implements Injector { Class<?> injectedClass = (Class<?>) type; if (injectedClass.isArray()) { Object[] services = getServices(adaptable, injectedClass.getComponentType(), filterString, callbackRegistry); + if (services == null) { + return null; + } Object arr = Array.newInstance(injectedClass.getComponentType(), services.length); for (int i = 0; i < services.length; i++) { Array.set(arr, i, services[i]); @@ -168,6 +171,9 @@ public class OSGiServiceInjector implements Injector { Class<?> serviceType = (Class<?>) ptype.getActualTypeArguments()[0]; Object[] services = getServices(adaptable, serviceType, filterString, callbackRegistry); + if (services == null) { + return null; + } return Arrays.asList(services); } else { log.warn("Cannot handle type {}", type); diff --git a/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java b/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java index b26eb13..9812003 100644 --- a/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java +++ b/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java @@ -30,6 +30,8 @@ import org.apache.sling.models.impl.injectors.OSGiServiceInjector; import org.apache.sling.models.testmodels.classes.ArrayOSGiModel; import org.apache.sling.models.testmodels.classes.CollectionOSGiModel; import org.apache.sling.models.testmodels.classes.ListOSGiModel; +import org.apache.sling.models.testmodels.classes.OptionalArrayOSGiModel; +import org.apache.sling.models.testmodels.classes.OptionalListOSGiModel; import org.apache.sling.models.testmodels.classes.RequestOSGiModel; import org.apache.sling.models.testmodels.classes.SetOSGiModel; import org.apache.sling.models.testmodels.classes.SimpleOSGiModel; @@ -161,6 +163,29 @@ public class OSGiInjectionTest { } @Test + public void testOptionalArrayOSGiModel() throws Exception { + + Resource res = mock(Resource.class); + + OptionalArrayOSGiModel model = factory.getAdapter(res, OptionalArrayOSGiModel.class); + assertNotNull(model); + assertNull(model.getServices()); + + verifyNoMoreInteractions(res); + } + + @Test + public void testOptionalListOSGiModel() throws Exception { + Resource res = mock(Resource.class); + + OptionalListOSGiModel model = factory.getAdapter(res, OptionalListOSGiModel.class); + assertNotNull(model); + assertNull(model.getServices()); + + verifyNoMoreInteractions(res); + } + + @Test public void testCollectionOSGiModel() throws Exception { ServiceReference ref1 = mock(ServiceReference.class); ServiceInterface service1 = mock(ServiceInterface.class); diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/OptionalArrayOSGiModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/OptionalArrayOSGiModel.java new file mode 100644 index 0000000..84aac68 --- /dev/null +++ b/src/test/java/org/apache/sling/models/testmodels/classes/OptionalArrayOSGiModel.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.sling.models.testmodels.classes; + +import javax.inject.Inject; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.Optional; +import org.apache.sling.models.testmodels.interfaces.ServiceInterface; + +@Model(adaptables = Resource.class) +public class OptionalArrayOSGiModel { + + @Inject @Optional + private ServiceInterface[] services; + + public ServiceInterface[] getServices() { + return services; + } + +} diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/OptionalListOSGiModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/OptionalListOSGiModel.java new file mode 100644 index 0000000..b8a2146 --- /dev/null +++ b/src/test/java/org/apache/sling/models/testmodels/classes/OptionalListOSGiModel.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.sling.models.testmodels.classes; + +import java.util.List; + +import javax.inject.Inject; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.Optional; +import org.apache.sling.models.testmodels.interfaces.ServiceInterface; + +@Model(adaptables = Resource.class) +public class OptionalListOSGiModel { + + @Inject @Optional + private List<ServiceInterface> services; + + public List<ServiceInterface> getServices() { + return services; + } + +} -- To stop receiving notification emails like this one, please contact "commits@sling.apache.org" <commits@sling.apache.org>.