Skip to content

Commit

Permalink
fix that ThingFieldSelector did not allow specific paths of "_metadata"
Browse files Browse the repository at this point in the history
* it only allowed to select top-level "_metadata" - which does not make sense to limit, as even selecting only specific _metadata is already supported
* also add missing support for featureId wildcard when selecting e.g. "_metadata/features/*/properties"

Signed-off-by: Thomas Jäckle <thomas.jaeckle@beyonnex.io>
  • Loading branch information
thjaeckle committed Oct 26, 2023
1 parent 38af233 commit 2f52170
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 6 deletions.
Expand Up @@ -38,8 +38,8 @@ public final class ThingFieldSelector implements JsonFieldSelector {
.withoutUrlDecoding()
.build();
static final List<String> SELECTABLE_FIELDS = Arrays.asList("thingId", "policyId", "definition",
"_namespace", "_revision", "_created", "_modified", "_metadata", "_policy", "_context", "_context(/[^,]+)?",
"features(/[^,]+)?", "attributes(/[^,]+)?");
"_namespace", "_revision", "_created", "_modified", "_metadata(/[^,]+)?", "_policy", "_context",
"_context(/[^,]+)?", "features(/[^,]+)?", "attributes(/[^,]+)?");
private static final String KNOWN_FIELDS_REGEX = "/?(" + String.join("|", SELECTABLE_FIELDS) + ")";
private static final String FIELD_SELECTION_REGEX = "^" + KNOWN_FIELDS_REGEX + "(," + KNOWN_FIELDS_REGEX + ")*$";
private static final Pattern FIELD_SELECTION_PATTERN = Pattern.compile(FIELD_SELECTION_REGEX);
Expand Down
Expand Up @@ -796,7 +796,12 @@ public static JsonFieldSelector expandFeatureIdWildcards(final Collection<JsonKe
*/
public static Stream<JsonPointer> expandFeatureIdWildcard(final Collection<JsonKey> featureIds,
final JsonPointer jsonPointer) {
if (hasFeatureIdWildcard(jsonPointer)) {
if (hasMetadataFeatureIdWildcard(jsonPointer)) {
return featureIds.stream().map(fid -> Thing.JsonFields.METADATA.getPointer()
.append(Thing.JsonFields.FEATURES.getPointer())
.append(JsonPointer.of(fid))
.append(jsonPointer.getSubPointer(3).orElse(JsonPointer.empty())));
} else if (hasFeatureIdWildcard(jsonPointer)) {
return featureIds.stream().map(fid -> Thing.JsonFields.FEATURES.getPointer()
.append(JsonPointer.of(fid))
.append(jsonPointer.getSubPointer(2).orElse(JsonPointer.empty())));
Expand All @@ -806,11 +811,33 @@ public static Stream<JsonPointer> expandFeatureIdWildcard(final Collection<JsonK
}

private static boolean hasFeatureIdWildcard(final JsonPointer pointer) {
return pointer.getLevelCount() > 1
&& pointer.getRoot()
return pointer.getLevelCount() > 1 &&
isFeaturePath(pointer) && pointer.get(1).filter(FEATURE_ID_WILDCARD::equals).isPresent();
}

private static boolean isFeaturePath(final JsonPointer pointer) {
return pointer.getRoot()
.filter(root -> Thing.JsonFields.FEATURES.getPointer().equals(JsonPointer.of(root)))
.isPresent();
}

private static boolean hasMetadataFeatureIdWildcard(final JsonPointer pointer) {
return pointer.getLevelCount() > 2 &&
isMetadataFeaturePath(pointer) &&
pointer.get(2).filter(FEATURE_ID_WILDCARD::equals).isPresent();
}

private static boolean isMetadataFeaturePath(final JsonPointer pointer) {
return pointer.getRoot()
.filter(root -> Thing.JsonFields.METADATA.getPointer().equals(JsonPointer.of(root)))
.isPresent()
&& pointer.get(1).filter(FEATURE_ID_WILDCARD::equals).isPresent();
&&
pointer.getSubPointer(1)
.map(metadataRoot -> metadataRoot.getRoot()
.filter(subRoot -> Thing.JsonFields.FEATURES.getPointer()
.equals(JsonPointer.of(subRoot)))
.isPresent()
).orElse(false);
}

}

0 comments on commit 2f52170

Please sign in to comment.