/** * Check if inlined policy should be retrieved together with the thing. * * @param command the thing query command. * @return whether it is necessary to retrieve the thing's policy. */ private static boolean shouldRetrievePolicyWithThing(final ThingCommand command) { final RetrieveThing retrieveThing = (RetrieveThing) command; final boolean isNotV1 = JsonSchemaVersion.V_1 != command.getImplementedSchemaVersion(); return isNotV1 && retrieveThing.getSelectedFields().filter(selector -> selector.getPointers().stream().anyMatch(jsonPointer -> jsonPointer.getRoot() .filter(jsonKey -> Policy.INLINED_FIELD_NAME.equals(jsonKey.toString())) .isPresent())) .isPresent(); }
@Override public PayloadBuilder withFields(final String fields) { this.fields = JsonFieldSelector.newInstance(fields); return this; }
/** * Sets the JSON fields which should be shown in the JSON document which is returned due to a HTTP request. * * @param selectedFields the selected JSON fields to be shown in the resulting JSON document. * @return this builder to allow method chaining. */ public Builder selectedFields(@Nullable final JsonFieldSelector selectedFields) { if (selectedFields == null || selectedFields.isEmpty()) { this.selectedFields = null; } else { this.selectedFields = selectedFields; } return this; }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) { final Predicate<JsonField> predicate = schemaVersion.and(thePredicate); final JsonArray thingIdsJsonArray = thingIds.stream() .map(JsonFactory::newValue) .collect(JsonCollectors.valuesToArray()); jsonObjectBuilder.set(JSON_THING_IDS, thingIdsJsonArray, predicate); if (null != selectedFields) { jsonObjectBuilder.set(SudoCommand.JsonFields.SELECTED_FIELDS, selectedFields.toString(), predicate); } }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) { final Predicate<JsonField> predicate = schemaVersion.and(thePredicate); final JsonArray thingIdsJsonArray = thingIds.stream() .map(JsonFactory::newValue) .collect(JsonCollectors.valuesToArray()); jsonObjectBuilder.set(JSON_THING_IDS, thingIdsJsonArray, predicate); if (null != selectedFields) { jsonObjectBuilder.set(SudoCommand.JsonFields.SELECTED_FIELDS, selectedFields.toString(), predicate); } }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) { final Predicate<JsonField> predicate = schemaVersion.and(thePredicate); getFilter().ifPresent(presentFilter -> jsonObjectBuilder.set(JSON_FILTER, presentFilter, predicate)); getOptions().ifPresent(presentOptions -> jsonObjectBuilder.set(JSON_OPTIONS, presentOptions.stream() .map(JsonValue::of) .collect(JsonCollectors.valuesToArray()), predicate)); getFields().ifPresent(presentFields -> jsonObjectBuilder.set(JSON_FIELDS, presentFields.toString(), predicate)); getNamespaces().ifPresent(presentOptions -> jsonObjectBuilder.set(JSON_NAMESPACES, presentOptions.stream() .map(JsonValue::of) .collect(JsonCollectors.valuesToArray()), predicate)); }
@Override public JsonObject get(final JsonFieldSelector fieldSelector) { requireNonNull(fieldSelector, "The JSON field selector must not be null!"); if (isEmpty()) { return this; } final List<JsonPointer> pointersContainedInThis = fieldSelector.getPointers() .stream() .filter(this::contains) .collect(Collectors.toList()); if (pointersContainedInThis.isEmpty()) { return JsonFactory.newObject(); } else { return filterByTrie(this, JsonFieldSelectorTrie.of(pointersContainedInThis)); } }
@Override public PayloadBuilder withFields(final String fields) { this.fields = JsonFieldSelector.newInstance(fields); return this; }
/** * Sets the JSON fields which should be shown in the JSON document which is returned due to a HTTP request. * * @param selectedFields the selected JSON fields to be shown in the resulting JSON document. * @return this builder to allow method chaining. */ public Builder selectedFields(@Nullable final JsonFieldSelector selectedFields) { if (selectedFields == null || selectedFields.isEmpty()) { this.selectedFields = null; } else { this.selectedFields = selectedFields; } return this; }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) { final Predicate<JsonField> predicate = schemaVersion.and(thePredicate); jsonObjectBuilder.set(ThingQueryCommand.JsonFields.JSON_THING_ID, thingId, predicate); if (selectedFields != null) { jsonObjectBuilder.set(JSON_SELECTED_FIELDS, selectedFields.toString(), predicate); } }
@Override public JsonObject get(final JsonFieldSelector fieldSelector) { requireNonNull(fieldSelector, "The JSON field selector must not be null!"); if (isEmpty()) { return this; } final List<JsonPointer> pointersContainedInThis = fieldSelector.getPointers() .stream() .filter(this::contains) .collect(Collectors.toList()); if (pointersContainedInThis.isEmpty()) { return empty(); } else { return filterByTrie(this, JsonFieldSelectorTrie.of(pointersContainedInThis)); } }
/** * Creates a sudo command for retrieving a thing. * * @param thingId the thingId. * @return the created command. */ static SudoRetrieveThing sudoRetrieveThing(final String thingId) { LOGGER.debug("Sending SudoRetrieveThing for Thing with ID <{}>", thingId); final JsonFieldSelector jsonFieldSelector = JsonFieldSelector.newInstance( Thing.JsonFields.ID.getPointer(), Thing.JsonFields.REVISION.getPointer(), Thing.JsonFields.ACL.getPointer(), Thing.JsonFields.POLICY_ID.getPointer()); return SudoRetrieveThing.withOriginalSchemaVersion(thingId, jsonFieldSelector, DittoHeaders.newBuilder().correlationId(getCorrelationId(thingId)).build()); }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) { final Predicate<JsonField> predicate = schemaVersion.and(thePredicate); final JsonArray thingIdsArray = thingIds.stream() .map(JsonFactory::newValue) .collect(JsonCollectors.valuesToArray()); jsonObjectBuilder.set(JSON_THING_IDS, thingIdsArray, predicate); if (namespace != null) { jsonObjectBuilder.set(JSON_NAMESPACE, namespace, predicate); } if (null != selectedFields) { jsonObjectBuilder.set(JSON_SELECTED_FIELDS, selectedFields.toString(), predicate); } }
.map(thing -> fieldSelector != null ? thing.toJson(jsonSchemaVersion, fieldSelector) : thing.toJson(jsonSchemaVersion)) .filter(thingJson -> fieldSelector == null || fieldSelector.getPointers().stream()
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) { final Predicate<JsonField> predicate = schemaVersion.and(thePredicate); getFilter().ifPresent(presentFilter -> jsonObjectBuilder.set(JSON_FILTER, presentFilter, predicate)); getOptions().ifPresent(presentOptions -> jsonObjectBuilder.set(JSON_OPTIONS, presentOptions.stream() .map(JsonValue::of) .collect(JsonCollectors.valuesToArray()), predicate)); getFields().ifPresent(presentFields -> jsonObjectBuilder.set(JSON_FIELDS, presentFields.toString(), predicate)); getNamespaces().ifPresent(presentOptions -> jsonObjectBuilder.set(JSON_NAMESPACES, presentOptions.stream() .map(JsonValue::of) .collect(JsonCollectors.valuesToArray()), predicate)); }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) { final Predicate<JsonField> predicate = schemaVersion.and(thePredicate); jsonObjectBuilder.set(ThingQueryCommand.JsonFields.JSON_THING_ID, thingId, predicate); if (selectedFields != null) { jsonObjectBuilder.set(JSON_SELECTED_FIELDS, selectedFields.toString(), predicate); } }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) { final Predicate<JsonField> predicate = schemaVersion.and(thePredicate); jsonObjectBuilder.set(ThingQueryCommand.JsonFields.JSON_THING_ID, thingId, predicate); if (null != selectedFields) { jsonObjectBuilder.set(JSON_SELECTED_FIELDS, selectedFields.toString(), predicate); } }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) { final Predicate<JsonField> predicate = schemaVersion.and(thePredicate); final JsonArray thingIdsArray = thingIds.stream() .map(JsonFactory::newValue) .collect(JsonCollectors.valuesToArray()); jsonObjectBuilder.set(JSON_THING_IDS, thingIdsArray, predicate); if (namespace != null) { jsonObjectBuilder.set(JSON_NAMESPACE, namespace, predicate); } if (null != selectedFields) { jsonObjectBuilder.set(JSON_SELECTED_FIELDS, selectedFields.toString(), predicate); } }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) { final Predicate<JsonField> predicate = schemaVersion.and(thePredicate); jsonObjectBuilder.set(ThingQueryCommand.JsonFields.JSON_THING_ID, thingId, predicate); if (null != selectedFields) { jsonObjectBuilder.set(JSON_SELECTED_FIELDS, selectedFields.toString(), predicate); } }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) { final Predicate<JsonField> predicate = schemaVersion.and(thePredicate); jsonObjectBuilder.set(SudoCommand.JsonFields.JSON_THING_ID, thingId, predicate); jsonObjectBuilder.set(JSON_USE_ORIGINAL_SCHEMA_VERSION, useOriginalSchemaVersion, predicate); if (null != selectedFields) { jsonObjectBuilder.set(SudoCommand.JsonFields.SELECTED_FIELDS, selectedFields.toString(), predicate); } }