in src/main/java/org/apache/sling/resourceresolver/impl/observation/ResourceChangeListenerInfo.java [66:168]
public ResourceChangeListenerInfo(
final ServiceReference<ResourceChangeListener> ref, final List<String> searchPaths) {
boolean configValid = true;
final Set<String> pathsSet = new HashSet<>();
final String paths[] =
Converters.standardConverter().convert(ref.getProperty(PATHS)).to(String[].class);
for (final String p : paths) {
boolean isGlobPattern = false;
String normalisedPath = ResourceUtil.normalize(p);
if (p.startsWith(Path.GLOB_PREFIX)) {
isGlobPattern = true;
normalisedPath = ResourceUtil.normalize(p.substring(Path.GLOB_PREFIX.length()));
}
if (!".".equals(p) && normalisedPath.isEmpty()) {
configValid = false;
} else if (normalisedPath.startsWith("/") && !isGlobPattern) {
pathsSet.add(normalisedPath);
} else if (normalisedPath.startsWith("/") && isGlobPattern) {
pathsSet.add(Path.GLOB_PREFIX + normalisedPath);
} else {
for (final String sp : searchPaths) {
if (p.equals(".")) {
pathsSet.add(sp);
} else {
if (isGlobPattern) {
pathsSet.add(Path.GLOB_PREFIX + ResourceUtil.normalize(sp + normalisedPath));
} else {
pathsSet.add(ResourceUtil.normalize(sp + normalisedPath));
}
}
}
}
}
if (pathsSet.isEmpty()) {
configValid = false;
} else {
// check for sub paths
final Iterator<String> iter = pathsSet.iterator();
while (iter.hasNext()) {
final String path = iter.next();
boolean remove = false;
for (final String p : pathsSet) {
if (p.length() > path.length() && path.startsWith(p + "/")) {
remove = true;
break;
}
}
if (remove) {
iter.remove();
}
}
}
this.paths = PathSet.fromStringCollection(pathsSet);
if (ref.getProperty(CHANGES) != null) {
final Set<ChangeType> rts = new HashSet<>();
final Set<ChangeType> pts = new HashSet<>();
try {
for (final String changeName : Converters.standardConverter()
.convert(ref.getProperty(CHANGES))
.to(String[].class)) {
final ChangeType ct = ChangeType.valueOf(changeName);
if (ct.ordinal() < ChangeType.PROVIDER_ADDED.ordinal()) {
rts.add(ct);
} else {
pts.add(ct);
}
}
} catch (final Exception e) {
configValid = false;
}
if (rts.isEmpty()) {
this.resourceChangeTypes = Collections.emptySet();
} else if (rts.size() == 3) {
this.resourceChangeTypes = DEFAULT_CHANGE_RESOURCE_TYPES;
} else {
this.resourceChangeTypes = Collections.unmodifiableSet(rts);
}
if (pts.isEmpty()) {
this.providerChangeTypes = Collections.emptySet();
} else if (pts.size() == 2) {
this.providerChangeTypes = DEFAULT_CHANGE_PROVIDER_TYPES;
} else {
this.providerChangeTypes = Collections.unmodifiableSet(pts);
}
} else {
// default is added, changed, removed for resources and
// added and removed for providers
this.resourceChangeTypes = DEFAULT_CHANGE_RESOURCE_TYPES;
this.providerChangeTypes = DEFAULT_CHANGE_PROVIDER_TYPES;
}
if (ref.getProperty(ResourceChangeListener.PROPERTY_NAMES_HINT) != null) {
this.propertyNamesHint = new HashSet<>();
for (final String val : Converters.standardConverter()
.convert(ref.getProperty(ResourceChangeListener.PROPERTY_NAMES_HINT))
.to(String[].class)) {
this.propertyNamesHint.add(val);
}
} else {
this.propertyNamesHint = null;
}
this.valid = configValid;
}