19
19
*/
20
20
package io .wcm .caconfig .extensions .references .impl ;
21
21
22
+ import static com .day .cq .dam .api .DamConstants .ACTIVITY_TYPE_ASSET ;
23
+
22
24
import java .util .ArrayList ;
23
25
import java .util .Arrays ;
24
26
import java .util .Calendar ;
48
50
import org .slf4j .Logger ;
49
51
import org .slf4j .LoggerFactory ;
50
52
53
+ import com .day .cq .dam .api .Asset ;
51
54
import com .day .cq .wcm .api .Page ;
52
55
import com .day .cq .wcm .api .PageFilter ;
53
56
import com .day .cq .wcm .api .PageManager ;
60
63
*
61
64
* <p>
62
65
* This is for example used by ActivationReferenceSearchServlet to resolve referenced content of pages during activation
63
- * of a page using AEM sites. Returning the configurations allows the editor to activate them along with the page
64
- * referring to them.
66
+ * of a page using AEM sites. Returning the configurations and (if enabled) asset references allows the editor to activate
67
+ * them along with the page referring to them.
65
68
* </p>
66
69
*
67
70
* <p>
73
76
public class ConfigurationReferenceProvider implements ReferenceProvider {
74
77
75
78
@ ObjectClassDefinition (name = "wcm.io Context-Aware Configuration Reference Provider" ,
76
- description = "Allows to resolve references from resources to their Context-Aware configurations, for example during page activation." )
79
+ description = "Allows to resolve references from resources to their Context-Aware configuration pages "
80
+ + "and referenced assets, for example during page activation." )
77
81
@interface Config {
78
82
79
83
@ AttributeDefinition (name = "Enabled" ,
80
84
description = "Enable this reference provider." )
81
85
boolean enabled () default true ;
86
+
87
+ @ AttributeDefinition (name = "Asset References" ,
88
+ description = "Check for asset references within the context-aware configurations, and add them to the list of references." )
89
+ boolean assetReferences () default false ;
90
+
82
91
}
83
92
84
93
static final String REFERENCE_TYPE = "caconfig" ;
@@ -93,6 +102,7 @@ public class ConfigurationReferenceProvider implements ReferenceProvider {
93
102
private ConfigurationResourceResolverConfig configurationResourceResolverConfig ;
94
103
95
104
private boolean enabled ;
105
+ private boolean assetReferencesEnabled ;
96
106
97
107
private static final Logger log = LoggerFactory .getLogger (ConfigurationReferenceProvider .class );
98
108
@@ -102,6 +112,7 @@ public class ConfigurationReferenceProvider implements ReferenceProvider {
102
112
@ Activate
103
113
protected void activate (Config config ) {
104
114
enabled = config .enabled ();
115
+ assetReferencesEnabled = config .assetReferences ();
105
116
}
106
117
107
118
@ Deactivate
@@ -127,6 +138,7 @@ public List<com.day.cq.wcm.api.reference.Reference> findReferences(Resource reso
127
138
Map <String , ConfigurationMetadata > configurationMetadatas = new TreeMap <>(configurationManager .getConfigurationNames ().stream ()
128
139
.collect (Collectors .toMap (configName -> configName , configName -> configurationManager .getConfigurationMetadata (configName ))));
129
140
List <com .day .cq .wcm .api .reference .Reference > references = new ArrayList <>();
141
+ Map <String , Asset > referencedAssets = new TreeMap <>();
130
142
Set <String > configurationBuckets = new LinkedHashSet <>(configurationResourceResolverConfig .configBucketNames ());
131
143
132
144
for (String configurationName : configurationMetadatas .keySet ()) {
@@ -138,7 +150,7 @@ public List<com.day.cq.wcm.api.reference.Reference> findReferences(Resource reso
138
150
Resource configurationResource = configurationInheritanceChain .next ();
139
151
140
152
// get page for configuration resource - and all children (e.g. for config collections)
141
- // collect in map to elimnate duplicate pages
153
+ // collect in map to eliminate duplicate pages
142
154
Page configPage = pageManager .getContainingPage (configurationResource );
143
155
if (configPage != null ) {
144
156
referencePages .put (configPage .getPath (), configPage );
@@ -152,8 +164,20 @@ public List<com.day.cq.wcm.api.reference.Reference> findReferences(Resource reso
152
164
153
165
// generate references for each page (but not if the context page itself is included as well)
154
166
referencePages .values ().stream ()
155
- .filter (item -> !StringUtils .equals (contextPage .getPath (), item .getPath ()))
156
- .forEach (item -> references .add (toReference (resource , item , configurationMetadatas , configurationBuckets )));
167
+ .filter (configPage -> !StringUtils .equals (contextPage .getPath (), configPage .getPath ()))
168
+ .forEach (configPage -> {
169
+ references .add (toReference (resource , configPage , configurationMetadatas , configurationBuckets ));
170
+ // collect asset references
171
+ if (assetReferencesEnabled && configPage .getContentResource () != null ) {
172
+ AssetRefereneDetector detector = new AssetRefereneDetector (configPage );
173
+ detector .getReferencedAssets ().stream ().forEach (asset -> referencedAssets .put (asset .getPath (), asset ));
174
+ }
175
+ });
176
+ }
177
+
178
+ if (!referencedAssets .isEmpty ()) {
179
+ // collect asset references detected in configuration pages (de-duplicated by using a map)
180
+ referencedAssets .values ().forEach (asset -> references .add (toReference (resource , asset )));
157
181
}
158
182
159
183
log .debug ("Found {} references for resource {}" , references .size (), resource .getPath ());
@@ -163,12 +187,18 @@ public List<com.day.cq.wcm.api.reference.Reference> findReferences(Resource reso
163
187
private com .day .cq .wcm .api .reference .Reference toReference (Resource resource , Page configPage ,
164
188
Map <String , ConfigurationMetadata > configurationMetadatas , Set <String > configurationBuckets ) {
165
189
log .trace ("Found configuration reference {} for resource {}" , configPage .getPath (), resource .getPath ());
166
- return new com .day .cq .wcm .api .reference .Reference (getType () ,
190
+ return new com .day .cq .wcm .api .reference .Reference (REFERENCE_TYPE ,
167
191
getReferenceName (configPage , configurationMetadatas , configurationBuckets ),
168
192
configPage .adaptTo (Resource .class ),
169
193
getLastModifiedOf (configPage ));
170
194
}
171
195
196
+ private com .day .cq .wcm .api .reference .Reference toReference (Resource resource , Asset asset ) {
197
+ log .trace ("Found asset reference {} for resource {}" , asset .getPath (), resource .getPath ());
198
+ return new com .day .cq .wcm .api .reference .Reference (ACTIVITY_TYPE_ASSET ,
199
+ asset .getName (), asset .adaptTo (Resource .class ), asset .getLastModified ());
200
+ }
201
+
172
202
/**
173
203
* Build reference display name from path with:
174
204
* - translating configuration names to labels
@@ -197,8 +227,4 @@ private static long getLastModifiedOf(Page page) {
197
227
return lastModified != null ? lastModified .getTimeInMillis () : 0 ;
198
228
}
199
229
200
- private static String getType () {
201
- return REFERENCE_TYPE ;
202
- }
203
-
204
230
}
0 commit comments