You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:54:55 UTC

[sling-org-apache-sling-models-api] 15/34: SLING-4155, consider default injection strategy also for injector-specific annotations

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.models.api-1.2.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-api.git

commit 788414497f5d5683f44cc21512a90aaff76ca28d
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Thu Nov 20 10:18:08 2014 +0000

    SLING-4155, consider default injection strategy also for injector-specific annotations
    
    by that deprecate isOptional on all injector-specific annotations and introduce the new injectionStrategy attribute as a replacement.
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/models/api@1640710 13f79535-47bb-0310-9956-ffa450edef68
---
 .../injectorspecific/ChildResource.java            | 10 ++++++++++
 .../{package-info.java => InjectionStrategy.java}  |  7 +++++--
 .../annotations/injectorspecific/OSGiService.java  | 10 ++++++++++
 .../injectorspecific/RequestAttribute.java         | 10 ++++++++++
 .../annotations/injectorspecific/ResourcePath.java | 10 ++++++++++
 .../injectorspecific/ScriptVariable.java           | 10 ++++++++++
 .../models/annotations/injectorspecific/Self.java  | 10 ++++++++++
 .../annotations/injectorspecific/SlingObject.java  | 22 ++++++++++++++++------
 .../injectorspecific/ValueMapValue.java            | 10 ++++++++++
 .../annotations/injectorspecific/package-info.java |  4 ++--
 .../AbstractInjectAnnotationProcessor.java         |  3 +++
 ...ava => AbstractInjectAnnotationProcessor2.java} | 15 +++++++++++++--
 .../InjectAnnotationProcessor.java                 |  5 +++++
 ...cessor.java => InjectAnnotationProcessor2.java} | 14 +++++++++-----
 .../InjectAnnotationProcessorFactory.java          |  3 ++-
 ...java => InjectAnnotationProcessorFactory2.java} |  7 +++----
 .../StaticInjectAnnotationProcessorFactory.java    |  2 +-
 .../models/spi/injectorspecific/package-info.java  |  2 +-
 18 files changed, 130 insertions(+), 24 deletions(-)

diff --git a/src/main/java/org/apache/sling/models/annotations/injectorspecific/ChildResource.java b/src/main/java/org/apache/sling/models/annotations/injectorspecific/ChildResource.java
index 26f32ce..25881bd 100644
--- a/src/main/java/org/apache/sling/models/annotations/injectorspecific/ChildResource.java
+++ b/src/main/java/org/apache/sling/models/annotations/injectorspecific/ChildResource.java
@@ -46,10 +46,20 @@ public @interface ChildResource {
      * If set to true, the model can be instantiated even if there is no child resource
      * with that name available.
      * Default = false.
+     * @deprecated Use {@link injectionStrategy} instead.
      */
+    @Deprecated
     public boolean optional() default false;
 
     /**
+     * if set to REQUIRED injection is mandatory, if set to OPTIONAL injection is optional, in case of DEFAULT 
+     * the standard annotations ({@link org.apache.sling.models.annotations.Optional}, {@link org.apache.sling.models.annotations.Required}) are used.
+     * If even those are not available the default injection strategy defined on the {@link org.apache.sling.models.annotations.Model} applies.
+     * Default value = DEFAULT.
+     */
+    public InjectionStrategy injectionStrategy() default InjectionStrategy.DEFAULT;
+
+    /**
      * If set, then the child resource can be obtained via a projection of the given
      * property of the adaptable.
      */
diff --git a/src/main/java/org/apache/sling/models/annotations/injectorspecific/package-info.java b/src/main/java/org/apache/sling/models/annotations/injectorspecific/InjectionStrategy.java
similarity index 92%
copy from src/main/java/org/apache/sling/models/annotations/injectorspecific/package-info.java
copy to src/main/java/org/apache/sling/models/annotations/injectorspecific/InjectionStrategy.java
index 52eee68..1ffe717 100644
--- a/src/main/java/org/apache/sling/models/annotations/injectorspecific/package-info.java
+++ b/src/main/java/org/apache/sling/models/annotations/injectorspecific/InjectionStrategy.java
@@ -14,7 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("1.0.2")
 package org.apache.sling.models.annotations.injectorspecific;
 
-import aQute.bnd.annotation.Version;
\ No newline at end of file
+public enum InjectionStrategy {
+    DEFAULT,
+    OPTIONAL,
+    REQUIRED
+}
diff --git a/src/main/java/org/apache/sling/models/annotations/injectorspecific/OSGiService.java b/src/main/java/org/apache/sling/models/annotations/injectorspecific/OSGiService.java
index a4363c9..fa487c0 100644
--- a/src/main/java/org/apache/sling/models/annotations/injectorspecific/OSGiService.java
+++ b/src/main/java/org/apache/sling/models/annotations/injectorspecific/OSGiService.java
@@ -47,6 +47,16 @@ public @interface OSGiService {
     /**
      * If set to true, the model can be instantiated even if there is no OSGi service implementation available. Default
      * = false.
+     * @deprecated Use {@link InjectionStrategy} instead.
      */
+    @Deprecated
     public boolean optional() default false;
+
+    /**
+     * if set to REQUIRED injection is mandatory, if set to OPTIONAL injection is optional, in case of DEFAULT 
+     * the standard annotations ({@link org.apache.sling.models.annotations.Optional}, {@link org.apache.sling.models.annotations.Required}) are used.
+     * If even those are not available the default injection strategy defined on the {@link org.apache.sling.models.annotations.Model} applies.
+     * Default value = DEFAULT.
+     */
+    public InjectionStrategy injectionStrategy() default InjectionStrategy.DEFAULT;
 }
diff --git a/src/main/java/org/apache/sling/models/annotations/injectorspecific/RequestAttribute.java b/src/main/java/org/apache/sling/models/annotations/injectorspecific/RequestAttribute.java
index 07626d4..99fb06d 100644
--- a/src/main/java/org/apache/sling/models/annotations/injectorspecific/RequestAttribute.java
+++ b/src/main/java/org/apache/sling/models/annotations/injectorspecific/RequestAttribute.java
@@ -48,6 +48,16 @@ public @interface RequestAttribute {
      * If set to true, the model can be instantiated even if there is no request attribute
      * with the given name found.
      * Default = false.
+     * @deprecated Use {@link InjectionStrategy} instead.
      */
+    @Deprecated
     public boolean optional() default false;
+
+    /**
+     * if set to REQUIRED injection is mandatory, if set to OPTIONAL injection is optional, in case of DEFAULT 
+     * the standard annotations ({@link org.apache.sling.models.annotations.Optional}, {@link org.apache.sling.models.annotations.Required}) are used.
+     * If even those are not available the default injection strategy defined on the {@link org.apache.sling.models.annotations.Model} applies.
+     * Default value = DEFAULT.
+     */
+    public InjectionStrategy injectonStrategy() default InjectionStrategy.DEFAULT;
 }
diff --git a/src/main/java/org/apache/sling/models/annotations/injectorspecific/ResourcePath.java b/src/main/java/org/apache/sling/models/annotations/injectorspecific/ResourcePath.java
index 23953ed..7a8d96c 100644
--- a/src/main/java/org/apache/sling/models/annotations/injectorspecific/ResourcePath.java
+++ b/src/main/java/org/apache/sling/models/annotations/injectorspecific/ResourcePath.java
@@ -52,7 +52,17 @@ public @interface ResourcePath {
      * If set to true, the model can be instantiated even if there is no request attribute
      * with the given name found.
      * Default = false.
+     * @deprecated Use {@link InjectionStrategy} instead.
      */
+    @Deprecated
     public boolean optional() default false;
 
+    /**
+     * if set to REQUIRED injection is mandatory, if set to OPTIONAL injection is optional, in case of DEFAULT 
+     * the standard annotations ({@link org.apache.sling.models.annotations.Optional}, {@link org.apache.sling.models.annotations.Required}) are used.
+     * If even those are not available the default injection strategy defined on the {@link org.apache.sling.models.annotations.Model} applies.
+     * Default value = DEFAULT.
+     */
+    public InjectionStrategy injectionStrategy() default InjectionStrategy.DEFAULT;
+
 }
diff --git a/src/main/java/org/apache/sling/models/annotations/injectorspecific/ScriptVariable.java b/src/main/java/org/apache/sling/models/annotations/injectorspecific/ScriptVariable.java
index d25c0e3..dd7a80f 100644
--- a/src/main/java/org/apache/sling/models/annotations/injectorspecific/ScriptVariable.java
+++ b/src/main/java/org/apache/sling/models/annotations/injectorspecific/ScriptVariable.java
@@ -47,6 +47,16 @@ public @interface ScriptVariable {
      * If set to true, the model can be instantiated even if there is no
      * scripting value with the specified name.
      * Default = false.
+     * @deprecated Use {@link InjectionStrategy} instead.
      */
+    @Deprecated
     public boolean optional() default false;
+
+    /**
+     * if set to REQUIRED injection is mandatory, if set to OPTIONAL injection is optional, in case of DEFAULT 
+     * the standard annotations ({@link org.apache.sling.models.annotations.Optional}, {@link org.apache.sling.models.annotations.Required}) are used.
+     * If even those are not available the default injection strategy defined on the {@link org.apache.sling.models.annotations.Model} applies.
+     * Default value = DEFAULT.
+     */
+    public InjectionStrategy injectionStrategy() default InjectionStrategy.DEFAULT;
 }
diff --git a/src/main/java/org/apache/sling/models/annotations/injectorspecific/Self.java b/src/main/java/org/apache/sling/models/annotations/injectorspecific/Self.java
index b452a76..66aa661 100644
--- a/src/main/java/org/apache/sling/models/annotations/injectorspecific/Self.java
+++ b/src/main/java/org/apache/sling/models/annotations/injectorspecific/Self.java
@@ -40,7 +40,17 @@ public @interface Self {
     /**
      * If set to true, the model can be instantiated even if there is no object that can be adapted from the adaptable itself. 
      * Default = false.
+     * @deprecated Use {@link injectionStrategy} instead
      */
+    @Deprecated
     public boolean optional() default false;
+    
+    /**
+     * if set to REQUIRED injection is mandatory, if set to OPTIONAL injection is optional, in case of DEFAULT 
+     * the standard annotations ({@link org.apache.sling.models.annotations.Optional}, {@link org.apache.sling.models.annotations.Required}) are used.
+     * If even those are not available the default injection strategy defined on the {@link org.apache.sling.models.annotations.Model} applies.
+     * Default value = DEFAULT.
+     */
+    public InjectionStrategy injectionStrategy() default InjectionStrategy.DEFAULT;
 
 }
diff --git a/src/main/java/org/apache/sling/models/annotations/injectorspecific/SlingObject.java b/src/main/java/org/apache/sling/models/annotations/injectorspecific/SlingObject.java
index 07a7c7c..d92e872 100644
--- a/src/main/java/org/apache/sling/models/annotations/injectorspecific/SlingObject.java
+++ b/src/main/java/org/apache/sling/models/annotations/injectorspecific/SlingObject.java
@@ -84,11 +84,21 @@ import org.apache.sling.models.spi.injectorspecific.InjectAnnotation;
 @Source("sling-object")
 public @interface SlingObject {
 
-  /**
-   * If set to true, the model can be instantiated even if there is no request attribute
-   * with the given name found.
-   * Default = false.
-   */
-  boolean optional() default false;
+    /**
+     * If set to true, the model can be instantiated even if there is no request attribute
+     * with the given name found.
+     * Default = false.
+     * @deprecated Use {@link injectionStrategy} instead
+     */
+    @Deprecated
+    boolean optional() default false;
+    
+    /**
+     * if set to REQUIRED injection is mandatory, if set to OPTIONAL injection is optional, in case of DEFAULT 
+     * the standard annotations ({@link org.apache.sling.models.annotations.Optional}, {@link org.apache.sling.models.annotations.Required}) are used.
+     * If even those are not available the default injection strategy defined on the {@link org.apache.sling.models.annotations.Model} applies.
+     * Default value = DEFAULT.
+     */
+    public InjectionStrategy injectionStrategy() default InjectionStrategy.DEFAULT;
 
 }
diff --git a/src/main/java/org/apache/sling/models/annotations/injectorspecific/ValueMapValue.java b/src/main/java/org/apache/sling/models/annotations/injectorspecific/ValueMapValue.java
index 4511d59..e606f7a 100644
--- a/src/main/java/org/apache/sling/models/annotations/injectorspecific/ValueMapValue.java
+++ b/src/main/java/org/apache/sling/models/annotations/injectorspecific/ValueMapValue.java
@@ -47,10 +47,20 @@ public @interface ValueMapValue {
      * If set to true, the model can be instantiated even if that value is missing.
      * Only considered if default is not set, because any default value implicitly
      * sets optional to true
+     * @deprecated Use {@link injectionStrategy} instead
      */
+    @Deprecated
     boolean optional() default false;
 
     /**
+     * if set to REQUIRED injection is mandatory, if set to OPTIONAL injection is optional, in case of DEFAULT 
+     * the standard annotations ({@link org.apache.sling.models.annotations.Optional}, {@link org.apache.sling.models.annotations.Required}) are used.
+     * If even those are not available the default injection strategy defined on the {@link org.apache.sling.models.annotations.Model} applies.
+     * Default value = DEFAULT.
+     */
+    InjectionStrategy injectionStrategy() default InjectionStrategy.DEFAULT;
+
+    /**
      * If set, then the child resource can be obtained via a projection of the given
      * property of the adaptable.
      */
diff --git a/src/main/java/org/apache/sling/models/annotations/injectorspecific/package-info.java b/src/main/java/org/apache/sling/models/annotations/injectorspecific/package-info.java
index 52eee68..0a3ed08 100644
--- a/src/main/java/org/apache/sling/models/annotations/injectorspecific/package-info.java
+++ b/src/main/java/org/apache/sling/models/annotations/injectorspecific/package-info.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("1.0.2")
+@Version("1.1.0")
 package org.apache.sling.models.annotations.injectorspecific;
 
-import aQute.bnd.annotation.Version;
\ No newline at end of file
+import aQute.bnd.annotation.Version;
diff --git a/src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor.java b/src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor.java
index 692a53b..efa0056 100644
--- a/src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor.java
+++ b/src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor.java
@@ -16,9 +16,12 @@
  */
 package org.apache.sling.models.spi.injectorspecific;
 
+
 /**
  * Default implementation of {@link InjectAnnotationProcessor}.
+ * @deprecated Use {@link AbstractInjectAnnotationProcessor2} instead
  */
+@Deprecated
 public class AbstractInjectAnnotationProcessor implements InjectAnnotationProcessor {
 
     public String getName() {
diff --git a/src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java b/src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor2.java
similarity index 68%
copy from src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java
copy to src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor2.java
index 6c61a09..0f1ec8c 100644
--- a/src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java
+++ b/src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor2.java
@@ -14,7 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("1.1.0")
 package org.apache.sling.models.spi.injectorspecific;
 
-import aQute.bnd.annotation.Version;
\ No newline at end of file
+import org.apache.sling.models.annotations.injectorspecific.InjectionStrategy;
+
+/**
+ * Default implementation of {@link InjectAnnotationProcessor2}.
+ *
+ */
+public class AbstractInjectAnnotationProcessor2 extends AbstractInjectAnnotationProcessor implements InjectAnnotationProcessor2 {
+
+    public InjectionStrategy getInjectionStrategy() {
+        return InjectionStrategy.DEFAULT;
+    }
+
+}
diff --git a/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessor.java b/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessor.java
index e2d05c4..9f652aa 100644
--- a/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessor.java
+++ b/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessor.java
@@ -18,7 +18,9 @@ package org.apache.sling.models.spi.injectorspecific;
 
 /**
  * Processor for injector-specific annotations.
+ * @deprecated Use {@link InjectAnntoationProcessor2} instead
  */
+@Deprecated
 public interface InjectAnnotationProcessor {
 
     /**
@@ -56,7 +58,10 @@ public interface InjectAnnotationProcessor {
      * 
      * @return the value to be used for the default or null, in
      *         which case the standard annotation should be used.
+     * @deprecated use {@link InjectAnntoationProcessor2.getInjectionStrategy} instead
      */
     Boolean isOptional();
 
+   
+
 }
diff --git a/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessor.java b/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessor2.java
similarity index 80%
copy from src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessor.java
copy to src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessor2.java
index e2d05c4..b3d11fb 100644
--- a/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessor.java
+++ b/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessor2.java
@@ -16,10 +16,13 @@
  */
 package org.apache.sling.models.spi.injectorspecific;
 
+import org.apache.sling.models.annotations.injectorspecific.InjectionStrategy;
+
 /**
  * Processor for injector-specific annotations.
  */
-public interface InjectAnnotationProcessor {
+@SuppressWarnings("deprecation")
+public interface InjectAnnotationProcessor2 extends InjectAnnotationProcessor{
 
     /**
      * Tries to get the name value from the annotation.
@@ -50,13 +53,14 @@ public interface InjectAnnotationProcessor {
      * @return the value to be used if nothing can be injected
      */
     Object getDefault();
-
+    
+    
     /**
      * Tries to get the information whether the injection is optional.
      * 
-     * @return the value to be used for the default or null, in
-     *         which case the standard annotation should be used.
+     * @return {@code REQUIRED} if injection is mandatory, {@code OPTIONAL} if injection is optional or {@code DEFAULT} in
+     *         which case the standard annotation/injection strategy should be used.
      */
-    Boolean isOptional();
+    InjectionStrategy getInjectionStrategy();
 
 }
diff --git a/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java b/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java
index 831e593..919a0b1 100644
--- a/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java
+++ b/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java
@@ -21,6 +21,7 @@ import java.lang.reflect.AnnotatedElement;
 /**
  * Factory for {@link InjectAnnotationProcessor} that is evaluated at runtime for each
  * sling model adaption and may depend on the adaptable. 
+ * Use {@link StaticInjectAnnotationProcessorFactory} preferably
  */
 public interface InjectAnnotationProcessorFactory {
 
@@ -30,7 +31,7 @@ public interface InjectAnnotationProcessorFactory {
      * @param element the field or method which is annotated
      * @return a ModelAnnotationProcessor in case there is a known
      *         injector-specific annotation on the given element found otherwise
-     *         null
+     *         null. This method should return a {@link InjectAnnotationProcessor2} preferably.
      */
     InjectAnnotationProcessor createAnnotationProcessor(Object adaptable, AnnotatedElement element);
 
diff --git a/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java b/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory2.java
similarity index 84%
copy from src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java
copy to src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory2.java
index 831e593..2b6f83a 100644
--- a/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java
+++ b/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory2.java
@@ -19,11 +19,11 @@ package org.apache.sling.models.spi.injectorspecific;
 import java.lang.reflect.AnnotatedElement;
 
 /**
- * Factory for {@link InjectAnnotationProcessor} that is evaluated at runtime for each
+ * Factory for {@link InjectAnnotationProcessor2} that is evaluated at runtime for each
  * sling model adaption and may depend on the adaptable. 
  */
-public interface InjectAnnotationProcessorFactory {
 
+public interface InjectAnnotationProcessorFactory2 {
     /**
      * 
      * @param adaptable the object from which this model is adapted
@@ -32,6 +32,5 @@ public interface InjectAnnotationProcessorFactory {
      *         injector-specific annotation on the given element found otherwise
      *         null
      */
-    InjectAnnotationProcessor createAnnotationProcessor(Object adaptable, AnnotatedElement element);
-
+    InjectAnnotationProcessor2 createAnnotationProcessor(Object adaptable, AnnotatedElement element);
 }
diff --git a/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java b/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java
index a3eff7d..9080839 100644
--- a/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java
+++ b/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java
@@ -32,6 +32,6 @@ public interface StaticInjectAnnotationProcessorFactory {
      *         injector-specific annotation on the given element found otherwise
      *         null
      */
-    InjectAnnotationProcessor createAnnotationProcessor(AnnotatedElement element);
+    InjectAnnotationProcessor2 createAnnotationProcessor(AnnotatedElement element);
 
 }
diff --git a/src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java b/src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java
index 6c61a09..1a59018 100644
--- a/src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java
+++ b/src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java
@@ -17,4 +17,4 @@
 @Version("1.1.0")
 package org.apache.sling.models.spi.injectorspecific;
 
-import aQute.bnd.annotation.Version;
\ No newline at end of file
+import aQute.bnd.annotation.Version;

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.