1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package io.wcm.dam.assetservice.impl;
21
22 import java.util.Collections;
23 import java.util.HashMap;
24 import java.util.HashSet;
25 import java.util.Iterator;
26 import java.util.Map;
27 import java.util.Set;
28 import java.util.concurrent.Executors;
29 import java.util.concurrent.ScheduledExecutorService;
30 import java.util.regex.Pattern;
31
32 import org.apache.commons.lang3.StringUtils;
33 import org.apache.sling.api.resource.ResourceResolverFactory;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 import com.day.cq.dam.api.DamConstants;
38 import com.day.cq.dam.api.DamEvent;
39
40 import io.wcm.dam.assetservice.impl.dataversion.ChecksumDataVersionStrategy;
41 import io.wcm.dam.assetservice.impl.dataversion.DataVersionStrategy;
42 import io.wcm.dam.assetservice.impl.dataversion.TimestampDataVersionStrategy;
43
44
45
46
47
48
49 public class DamPathHandler {
50
51
52
53
54 private static final String DEFAULT_DAM_PATH = DamConstants.MOUNTPOINT_ASSETS;
55
56 private final Set<String> damPaths;
57 private final Pattern damPathsPattern;
58 private final ScheduledExecutorService executor;
59 private final Map<String, DataVersionStrategy> dataVersionStrategies;
60
61 private static final Logger log = LoggerFactory.getLogger(DamPathHandler.class);
62
63
64
65
66
67
68
69 public DamPathHandler(final String[] configuredDamPaths,
70 String dataVersionStrategyId,
71 int dataVersionUpdateIntervalSec,
72 ResourceResolverFactory resourceResolverFactory) {
73
74
75 this.damPaths = validateDamPaths(configuredDamPaths);
76 this.damPathsPattern = buildDamPathsPattern(this.damPaths);
77
78 log.debug("Start executor for DamPathHandler");
79 this.executor = Executors.newSingleThreadScheduledExecutor();
80
81 dataVersionStrategies = new HashMap<>();
82 for (String damPath : this.damPaths) {
83 DataVersionStrategy dataVersionStrategy = getDataVersionStrategy(damPath, dataVersionStrategyId,
84 dataVersionUpdateIntervalSec, resourceResolverFactory, this.executor);
85 dataVersionStrategies.put(damPath, dataVersionStrategy);
86 }
87 }
88
89 private static DataVersionStrategy getDataVersionStrategy(String damPath, String dataVersionStrategyId,
90 int dataVersionUpdateIntervalSec, ResourceResolverFactory resourceResolverFactory,
91 ScheduledExecutorService executor) {
92 if (StringUtils.equals(dataVersionStrategyId, TimestampDataVersionStrategy.STRATEGY)) {
93 return new TimestampDataVersionStrategy(damPath);
94 }
95 if (StringUtils.equals(dataVersionStrategyId, ChecksumDataVersionStrategy.STRATEGY)) {
96 return new ChecksumDataVersionStrategy(damPath, dataVersionUpdateIntervalSec, resourceResolverFactory, executor);
97 }
98 throw new IllegalArgumentException("Invalid data version strategy: " + dataVersionStrategyId);
99 }
100
101
102
103
104 public void shutdown() {
105 log.debug("Shutdown executor for DamPathHandler");
106 this.executor.shutdownNow();
107 }
108
109 private static Set<String> validateDamPaths(String[] damPaths) {
110 Set<String> paths = new HashSet<>();
111 if (damPaths != null) {
112 for (String path : damPaths) {
113 if (StringUtils.isNotBlank(path)) {
114 paths.add(path);
115 }
116 }
117 }
118 if (paths.isEmpty()) {
119 paths.add(DEFAULT_DAM_PATH);
120 }
121 return Collections.unmodifiableSet(paths);
122 }
123
124
125
126
127
128
129 private static Pattern buildDamPathsPattern(Set<String> damPaths) {
130 StringBuilder pattern = new StringBuilder();
131 pattern.append("^(");
132 Iterator<String> paths = damPaths.iterator();
133 while (paths.hasNext()) {
134 pattern.append(Pattern.quote(paths.next()));
135 pattern.append("/.*");
136 if (paths.hasNext()) {
137 pattern.append("|");
138 }
139 }
140 pattern.append(")$");
141 return Pattern.compile(pattern.toString());
142 }
143
144
145
146
147
148
149 public boolean isAllowedAssetPath(String assetPath) {
150 if (assetPath == null) {
151 return false;
152 }
153 return damPathsPattern.matcher(assetPath).matches();
154 }
155
156
157
158
159
160
161 public boolean isAllowedDataVersionPath(String path) {
162 return damPaths.contains(path);
163 }
164
165
166
167
168
169 public String getDataVersion(String damPath) {
170 DataVersionStrategy dataVersionStrategy = this.dataVersionStrategies.get(damPath);
171 if (dataVersionStrategy != null) {
172 return dataVersionStrategy.getDataVersion();
173 }
174 else {
175 return null;
176 }
177 }
178
179
180
181
182
183 public void handleDamEvent(DamEvent event) {
184 if (isAllowedAssetPath(event.getAssetPath())) {
185
186 DataVersionStrategy dataVersionStrategy = getMatchingDataVersionStrategy(event.getAssetPath());
187 if (dataVersionStrategy != null) {
188 dataVersionStrategy.handleDamEvent(event);
189 }
190 }
191 }
192
193 private DataVersionStrategy getMatchingDataVersionStrategy(String path) {
194
195 if (dataVersionStrategies.size() == 1) {
196 return dataVersionStrategies.values().iterator().next();
197 }
198
199 for (DataVersionStrategy dataVersionStrategy : this.dataVersionStrategies.values()) {
200 if (dataVersionStrategy.matches(path)) {
201 return dataVersionStrategy;
202 }
203 }
204 return null;
205 }
206
207 }