fixes after review
diff --git a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java b/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
index 2142b74..2d90ee0 100644
--- a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
+++ b/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
@@ -59,6 +59,7 @@
import org.apache.sling.models.impl.model.InjectableMethod;
import org.apache.sling.models.impl.model.ModelClass;
import org.apache.sling.models.impl.model.ModelClassConstructor;
+import org.apache.sling.models.impl.model.OptionalTypedInjectableElement;
import org.apache.sling.models.spi.AcceptsNullName;
import org.apache.sling.models.spi.DisposalCallback;
import org.apache.sling.models.spi.DisposalCallbackRegistry;
@@ -480,59 +481,22 @@
}
}
- @NotNull
- private InjectableElement getElement(InjectableElement element, Type type) {
- return new InjectableElement() {
- @Override
- public AnnotatedElement getAnnotatedElement() {
- return element.getAnnotatedElement();
- }
+ private class OptionalWrappingCallback implements InjectCallback {
- @Override
- public Type getType() {
- return type;
- }
+ private final InjectCallback chainedCallback;
+ private final InjectableElement element;
- @Override
- public boolean isPrimitive() {
- return element.isPrimitive();
- }
+ private OptionalWrappingCallback(InjectCallback chainedCallback, InjectableElement element) {
+ this.chainedCallback = chainedCallback;
+ this.element = element;
+ }
- @Override
- public String getName() {
- return element.getName();
- }
-
- @Override
- public String getSource() {
- return element.getSource();
- }
-
- @Override
- public String getVia() {
- return element.getVia();
- }
-
- @Override
- public Class<? extends ViaProviderType> getViaProviderType() {
- return element.getViaProviderType();
- }
-
- @Override
- public boolean hasDefaultValue() {
- return element.hasDefaultValue();
- }
-
- @Override
- public Object getDefaultValue() {
- return element.getDefaultValue() == null ? Optional.empty() : element.getDefaultValue();
- }
-
- @Override
- public boolean isOptional(InjectAnnotationProcessor annotationProcessor) {
- return true;
- }
- };
+ @Override
+ public RuntimeException inject(InjectableElement element1, Object value) {
+ return chainedCallback.inject(element, value.equals(Optional.empty())
+ ? value // if the value is null it's already represented as Optional.empty(), return as is
+ : Optional.of(value)); // otherwise wrap in Optional
+ }
}
private
@@ -548,16 +512,10 @@
ParameterizedType pType = (ParameterizedType) genericType;
if (pType.getRawType().equals(Optional.class)) {
- InjectableElement el = getElement(element, pType.getActualTypeArguments()[0]);
+ InjectableElement el = new OptionalTypedInjectableElement(element, pType.getActualTypeArguments()[0]);
+ InjectCallback wrappedCallback = new OptionalWrappingCallback(callback, element);
- return injectElementInternal(el, adaptable, registry, new InjectCallback() {
- @Override
- public RuntimeException inject(InjectableElement element1, Object value) {
- return callback.inject(element, value.equals(Optional.empty())
- ? value
- : Optional.of(value));
- }
- }, preparedValues, modelContext);
+ return injectElementInternal(el, adaptable, registry, wrappedCallback, preparedValues, modelContext);
}
}
}
diff --git a/src/main/java/org/apache/sling/models/impl/model/OptionalTypedInjectableElement.java b/src/main/java/org/apache/sling/models/impl/model/OptionalTypedInjectableElement.java
new file mode 100644
index 0000000..ba4f160
--- /dev/null
+++ b/src/main/java/org/apache/sling/models/impl/model/OptionalTypedInjectableElement.java
@@ -0,0 +1,86 @@
+/*
+ * 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.impl.model;
+
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Type;
+import java.util.Optional;
+
+import org.apache.sling.models.annotations.ViaProviderType;
+import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessor;
+
+public class OptionalTypedInjectableElement implements InjectableElement {
+
+ private final InjectableElement element;
+ private final Type type;
+
+ public OptionalTypedInjectableElement(InjectableElement element, Type type) {
+ this.element = element;
+ this.type = type;
+ }
+
+ @Override
+ public AnnotatedElement getAnnotatedElement() {
+ return element.getAnnotatedElement();
+ }
+
+ @Override
+ public Type getType() {
+ return type;
+ }
+
+ @Override
+ public boolean isPrimitive() {
+ return element.isPrimitive();
+ }
+
+ @Override
+ public String getName() {
+ return element.getName();
+ }
+
+ @Override
+ public String getSource() {
+ return element.getSource();
+ }
+
+ @Override
+ public String getVia() {
+ return element.getVia();
+ }
+
+ @Override
+ public Class<? extends ViaProviderType> getViaProviderType() {
+ return element.getViaProviderType();
+ }
+
+ @Override
+ public boolean hasDefaultValue() {
+ return element.hasDefaultValue();
+ }
+
+ @Override
+ public Object getDefaultValue() {
+ // Default value injector will be evaluated last, make sure we return a value here so the injection is successful
+ return element.getDefaultValue() == null ? Optional.empty() : element.getDefaultValue();
+ }
+
+ @Override
+ public boolean isOptional(InjectAnnotationProcessor annotationProcessor) {
+ return true;
+ }
+}