Skip to content

Commit 6c0078c

Browse files
authored
Adding @CurrentPage, @PageTemplate annotations (#3)
* Adding @CurrentPage, @PageTemplate annotations - Adding new annotations - Removing non needed dependencies - Updating pom.xml - Updating README.md * Adding version to 0.0.2
1 parent 049e95e commit 6c0078c

16 files changed

+346
-46
lines changed

README.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ private LocalDateTime date;
7070
private LocalDatetime date;
7171
```
7272

73+
```
74+
@CurrentPage
75+
private Page page;
76+
```
77+
78+
```
79+
@PageTemplate
80+
private Template template;
81+
```
82+
7383
Annotations `LocalDateValueMapValue` and `LocalDateTimeValueMapValue` have the same properties as ordinary `@ValueMapValue` to inject object with different name or in different structure path.
7484

7585
## Known issues of dependency not getting resolved
@@ -89,8 +99,7 @@ If your bundle can't resolve the dependency, there might be a issue that it's no
8999
<configuration>
90100
<bnd><![CDATA[
91101
Import-Package: javax.annotation;version=0.0.0,*
92-
com.juricamigac.aem.slingspecificannotations.*;0.0.1,*
93-
Export-Package: com.juricamigac.aem.slingspecificannotations.*;0.0.1,\
102+
Export-Package: com.juricamigac.slingspecificannotations.*;0.0.2,\
94103
]]></bnd>
95104
</configuration>
96105
</execution>

pom.xml

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,35 @@
33
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
44

55
<modelVersion>4.0.0</modelVersion>
6-
76
<parent>
87
<groupId>org.sonatype.oss</groupId>
98
<artifactId>oss-parent</artifactId>
109
<version>7</version>
1110
</parent>
12-
1311
<groupId>com.juricamigac</groupId>
1412
<artifactId>sling-specific-annotations</artifactId>
15-
<version>0.0.1</version>
16-
13+
<version>0.0.2</version>
1714
<packaging>bundle</packaging>
18-
1915
<name>Sling specific annotations</name>
20-
2116
<distributionManagement>
2217
<repository>
2318
<id>github</id>
2419
<name>Sling specific annotations</name>
2520
<url>https://maven.pkg.github.com/jmigac/sling-specific-annotations</url>
2621
</repository>
2722
</distributionManagement>
28-
2923
<properties>
3024
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3125
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
32-
3326
<license.year>2022</license.year>
3427
<project.build.by>Jurica Migač</project.build.by>
3528
<aem.sdk.version>2021.11.6058.20211123T163652Z-211000</aem.sdk.version>
3629
<project.package.id>slingspecificannotations</project.package.id>
3730
<bundle.name>${project.groupId} :: ${project.package.id}</bundle.name>
3831
<bundle.symbolicName>${project.groupId}.${project.package.id}</bundle.symbolicName>
3932
<bundle.namespace>${project.groupId}.${project.package.id}</bundle.namespace>
40-
4133
<slf4j.version>1.7.7</slf4j.version>
42-
<log4j.version>1.2.17</log4j.version>
43-
34+
<log4j.version>1.2.16</log4j.version>
4435
<junit.version>4.11</junit.version>
4536
<mockito.version>1.9.5</mockito.version>
4637
</properties>
@@ -102,7 +93,7 @@
10293
<Bundle-SymbolicName>${bundle.symbolicName}</Bundle-SymbolicName>
10394
<Bundle-Version>${project.version}</Bundle-Version>
10495
<Embed-Dependency>*;scope=compile|runtime;type=!pom;inline=true</Embed-Dependency>
105-
<Export-Package>${bundle.namespace}.*;${project.version}</Export-Package>
96+
<Export-Package>${bundle.namespace}.*;version=${project.version}</Export-Package>
10697
</instructions>
10798
</configuration>
10899
</plugin>
@@ -190,25 +181,6 @@
190181
<artifactId>slf4j-log4j12</artifactId>
191182
<version>${slf4j.version}</version>
192183
</dependency>
193-
<dependency>
194-
<groupId>log4j</groupId>
195-
<artifactId>log4j</artifactId>
196-
<version>${log4j.version}</version>
197-
</dependency>
198-
199-
<!-- test dependencies -->
200-
<dependency>
201-
<groupId>junit</groupId>
202-
<artifactId>junit</artifactId>
203-
<version>${junit.version}</version>
204-
<scope>test</scope>
205-
</dependency>
206-
<dependency>
207-
<groupId>org.mockito</groupId>
208-
<artifactId>mockito-all</artifactId>
209-
<version>${mockito.version}</version>
210-
<scope>test</scope>
211-
</dependency>
212184
</dependencies>
213185

214186
<profiles>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.juricamigac.slingspecificannotations.annotations;
2+
3+
import org.apache.sling.models.annotations.Source;
4+
import org.apache.sling.models.spi.injectorspecific.InjectAnnotation;
5+
6+
import java.lang.annotation.ElementType;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.RetentionPolicy;
9+
import java.lang.annotation.Target;
10+
11+
@Target(ElementType.FIELD)
12+
@Retention(RetentionPolicy.RUNTIME)
13+
@InjectAnnotation
14+
@Source("current-page-sling-specific-injection")
15+
public @interface CurrentPage {}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.juricamigac.slingspecificannotations.annotations;
2+
3+
import org.apache.sling.models.annotations.Source;
4+
import org.apache.sling.models.spi.injectorspecific.InjectAnnotation;
5+
6+
import java.lang.annotation.ElementType;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.RetentionPolicy;
9+
import java.lang.annotation.Target;
10+
11+
@Target(ElementType.FIELD)
12+
@Retention(RetentionPolicy.RUNTIME)
13+
@InjectAnnotation
14+
@Source("page-template-sling-specific-injection")
15+
public @interface PageTemplate {}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.juricamigac.slingspecificannotations.annotations;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
import org.apache.sling.models.annotations.Source;
5+
import org.apache.sling.models.spi.injectorspecific.InjectAnnotation;
6+
7+
import java.lang.annotation.ElementType;
8+
import java.lang.annotation.Retention;
9+
import java.lang.annotation.RetentionPolicy;
10+
import java.lang.annotation.Target;
11+
12+
@Target(ElementType.FIELD)
13+
@Retention(RetentionPolicy.RUNTIME)
14+
@InjectAnnotation
15+
@Source("request-parameter-sling-specific-injection")
16+
public @interface RequestParameter {
17+
18+
String name() default StringUtils.EMPTY;
19+
20+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.juricamigac.slingspecificannotations.constants;
2+
3+
import lombok.AccessLevel;
4+
import lombok.NoArgsConstructor;
5+
6+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
7+
public class ServiceRankingConstants {
8+
9+
public static final int SLING_ANNOTATIONS_SERVICE_RANKING = 6500;
10+
11+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.juricamigac.slingspecificannotations.dataprocessor;
2+
3+
import com.day.cq.wcm.api.Page;
4+
import com.day.cq.wcm.api.PageManager;
5+
import com.day.cq.wcm.api.PageManagerFactory;
6+
import com.juricamigac.slingspecificannotations.annotations.CurrentPage;
7+
import com.juricamigac.slingspecificannotations.constants.ServiceRankingConstants;
8+
import com.juricamigac.slingspecificannotations.dataprocessor.annotationsprocessor.CurrentPageMetadataProviderAnnotationProcessor;
9+
import org.apache.sling.api.SlingHttpServletRequest;
10+
import org.apache.sling.api.resource.Resource;
11+
import org.apache.sling.models.spi.DisposalCallbackRegistry;
12+
import org.apache.sling.models.spi.Injector;
13+
import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessor2;
14+
import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory;
15+
import org.osgi.service.component.annotations.Component;
16+
import org.osgi.service.component.annotations.Reference;
17+
18+
import java.lang.reflect.AnnotatedElement;
19+
import java.lang.reflect.Type;
20+
21+
import static org.osgi.framework.Constants.SERVICE_RANKING;
22+
23+
@Component(
24+
immediate = true,
25+
service = {Injector.class, StaticInjectAnnotationProcessorFactory.class},
26+
property = {SERVICE_RANKING + ":Integer=" + ServiceRankingConstants.SLING_ANNOTATIONS_SERVICE_RANKING})
27+
public class CurrentPageProcessor implements Injector, StaticInjectAnnotationProcessorFactory {
28+
29+
private static final String CURRENT_PAGE_SOURCE = "current-page-sling-specific-injection";
30+
31+
@Reference
32+
private PageManagerFactory pageManagerFactory;
33+
34+
@Override
35+
public String getName() {
36+
return CURRENT_PAGE_SOURCE;
37+
}
38+
39+
@Override
40+
public Object getValue(Object adaptable, String fieldName, Type type, AnnotatedElement annotatedElement, DisposalCallbackRegistry disposalCallbackRegistry) {
41+
if (adaptable instanceof Resource && this.isPage(type, annotatedElement)) {
42+
final Resource resource = (Resource) adaptable;
43+
return this.getPageFromAdaptable(resource);
44+
} else if (adaptable instanceof SlingHttpServletRequest && this.isPage(type, annotatedElement)) {
45+
final SlingHttpServletRequest request = (SlingHttpServletRequest) adaptable;
46+
return this.getPageFromAdaptable(request.getResource());
47+
}
48+
return null;
49+
}
50+
51+
private boolean isPage(final Type type, final AnnotatedElement annotatedElement) {
52+
return type.equals(Page.class) && annotatedElement.isAnnotationPresent(CurrentPage.class);
53+
}
54+
55+
@Override
56+
public InjectAnnotationProcessor2 createAnnotationProcessor(AnnotatedElement annotatedElement) {
57+
final CurrentPage annotation = annotatedElement.getAnnotation(CurrentPage.class);
58+
if (annotation != null) {
59+
return new CurrentPageMetadataProviderAnnotationProcessor();
60+
}
61+
return null;
62+
}
63+
64+
private Page getPageFromAdaptable(final Resource resource) {
65+
final PageManager pageManager = this.pageManagerFactory.getPageManager(resource.getResourceResolver());
66+
return pageManager.getContainingPage(resource);
67+
}
68+
69+
}

src/main/java/com/juricamigac/slingspecificannotations/dataprocessor/LocalDateProcessor.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.juricamigac.slingspecificannotations.dataprocessor;
22

3+
import com.juricamigac.slingspecificannotations.annotations.LocalDateValueMapValue;
4+
import com.juricamigac.slingspecificannotations.constants.ServiceRankingConstants;
5+
import com.juricamigac.slingspecificannotations.dataprocessor.annotationsprocessor.RequestedDateMetadataProviderAnnotationProcessor;
36
import lombok.extern.slf4j.Slf4j;
47
import org.apache.commons.lang3.StringUtils;
58
import org.apache.sling.api.SlingHttpServletRequest;
@@ -8,8 +11,6 @@
811
import org.apache.sling.models.spi.Injector;
912
import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessor2;
1013
import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory;
11-
import com.juricamigac.slingspecificannotations.annotations.LocalDateValueMapValue;
12-
import com.juricamigac.slingspecificannotations.dataprocessor.annotationsprocessor.RequestedDateMetadataProviderAnnotationProcessor;
1314
import org.osgi.service.component.annotations.Component;
1415

1516
import java.lang.reflect.AnnotatedElement;
@@ -24,8 +25,7 @@
2425
@Component(
2526
immediate = true,
2627
service = {Injector.class, StaticInjectAnnotationProcessorFactory.class},
27-
property = {SERVICE_RANKING + ":Integer=7000"}
28-
)
28+
property = {SERVICE_RANKING + ":Integer=" + ServiceRankingConstants.SLING_ANNOTATIONS_SERVICE_RANKING})
2929
public class LocalDateProcessor implements Injector, StaticInjectAnnotationProcessorFactory {
3030

3131
private static final String INJECTION_NAME = "local-date-provider-injector";

src/main/java/com/juricamigac/slingspecificannotations/dataprocessor/LocalDateTimeProcessor.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.juricamigac.slingspecificannotations.dataprocessor;
22

3+
import com.juricamigac.slingspecificannotations.annotations.LocalDateTimeValueMapValue;
4+
import com.juricamigac.slingspecificannotations.constants.ServiceRankingConstants;
5+
import com.juricamigac.slingspecificannotations.dataprocessor.annotationsprocessor.RequestedDateTimeMetadataProviderAnnotationProcessor;
36
import lombok.extern.slf4j.Slf4j;
47
import org.apache.commons.lang3.StringUtils;
58
import org.apache.sling.api.SlingHttpServletRequest;
@@ -8,20 +11,21 @@
811
import org.apache.sling.models.spi.Injector;
912
import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessor2;
1013
import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory;
11-
import com.juricamigac.slingspecificannotations.annotations.LocalDateTimeValueMapValue;
12-
import com.juricamigac.slingspecificannotations.dataprocessor.annotationsprocessor.RequestedDateTimeMetadataProviderAnnotationProcessor;
1314
import org.osgi.service.component.annotations.Component;
14-
import org.osgi.service.component.propertytypes.ServiceRanking;
1515

1616
import java.lang.reflect.AnnotatedElement;
1717
import java.lang.reflect.Type;
1818
import java.time.LocalDateTime;
1919
import java.time.ZoneId;
2020
import java.util.Date;
2121

22+
import static org.osgi.framework.Constants.SERVICE_RANKING;
23+
2224
@Slf4j
23-
@Component(immediate = true, service = { Injector.class, StaticInjectAnnotationProcessorFactory.class })
24-
@ServiceRanking(LocalDateTimeProcessor.SERVICE_RANKING)
25+
@Component(
26+
immediate = true,
27+
service = {Injector.class, StaticInjectAnnotationProcessorFactory.class},
28+
property = {SERVICE_RANKING + ":Integer=" + ServiceRankingConstants.SLING_ANNOTATIONS_SERVICE_RANKING})
2529
public class LocalDateTimeProcessor implements Injector, StaticInjectAnnotationProcessorFactory {
2630

2731
protected static final int SERVICE_RANKING = Integer.MAX_VALUE;
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.juricamigac.slingspecificannotations.dataprocessor;
2+
3+
import com.day.cq.wcm.api.Page;
4+
import com.day.cq.wcm.api.PageManager;
5+
import com.day.cq.wcm.api.PageManagerFactory;
6+
import com.day.cq.wcm.api.Template;
7+
import com.juricamigac.slingspecificannotations.annotations.PageTemplate;
8+
import com.juricamigac.slingspecificannotations.constants.ServiceRankingConstants;
9+
import com.juricamigac.slingspecificannotations.dataprocessor.annotationsprocessor.PageTemplateMetadataProviderAnnotationProcessor;
10+
import org.apache.sling.api.SlingHttpServletRequest;
11+
import org.apache.sling.api.resource.Resource;
12+
import org.apache.sling.models.spi.DisposalCallbackRegistry;
13+
import org.apache.sling.models.spi.Injector;
14+
import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessor2;
15+
import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory;
16+
import org.osgi.service.component.annotations.Component;
17+
import org.osgi.service.component.annotations.Reference;
18+
19+
import java.lang.reflect.AnnotatedElement;
20+
import java.lang.reflect.Type;
21+
22+
import static org.osgi.framework.Constants.SERVICE_RANKING;
23+
24+
@Component(
25+
immediate = true,
26+
service = {Injector.class, StaticInjectAnnotationProcessorFactory.class},
27+
property = {SERVICE_RANKING + ":Integer=" + ServiceRankingConstants.SLING_ANNOTATIONS_SERVICE_RANKING})
28+
public class PageTemplateProcessor implements Injector, StaticInjectAnnotationProcessorFactory {
29+
30+
private static final String PAGE_TEMPLATE_ANNOTATION_SOURCE = "page-template-sling-specific-injection";
31+
32+
@Reference
33+
private PageManagerFactory pageManagerFactory;
34+
35+
@Override
36+
public String getName() {
37+
return PAGE_TEMPLATE_ANNOTATION_SOURCE;
38+
}
39+
40+
@Override
41+
public Object getValue(Object adaptable, String fieldName, Type type, AnnotatedElement annotatedElement, DisposalCallbackRegistry disposalCallbackRegistry) {
42+
if (adaptable instanceof Resource && this.isTemplate(type, annotatedElement)) {
43+
final Resource resource = (Resource) adaptable;
44+
return this.getPageTemplateFromResource(resource);
45+
} else if (adaptable instanceof SlingHttpServletRequest && this.isTemplate(type, annotatedElement)) {
46+
final SlingHttpServletRequest request = (SlingHttpServletRequest) adaptable;
47+
return this.getPageTemplateFromResource(request.getResource());
48+
}
49+
return null;
50+
}
51+
52+
private boolean isTemplate(final Type type, final AnnotatedElement annotatedElement) {
53+
return type.equals(Template.class) && annotatedElement.isAnnotationPresent(PageTemplate.class);
54+
}
55+
56+
@Override
57+
public InjectAnnotationProcessor2 createAnnotationProcessor(AnnotatedElement annotatedElement) {
58+
final PageTemplate annotation = annotatedElement.getAnnotation(PageTemplate.class);
59+
if (annotation != null) {
60+
return new PageTemplateMetadataProviderAnnotationProcessor();
61+
}
62+
return null;
63+
}
64+
65+
private Template getPageTemplateFromResource(final Resource resource) {
66+
final PageManager pageManager = this.pageManagerFactory.getPageManager(resource.getResourceResolver());
67+
final Page page = pageManager.getContainingPage(resource);
68+
return page.getTemplate();
69+
}
70+
71+
}

0 commit comments

Comments
 (0)