Skip to content

Commit

Permalink
#1959: fix base and href of generated WoT ThingDescriptions
Browse files Browse the repository at this point in the history
Signed-off-by: Thomas Jäckle <thomas.jaeckle@beyonnex.io>
  • Loading branch information
thjaeckle committed Jun 12, 2024
1 parent c572154 commit 80b89f3
Showing 1 changed file with 31 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

import org.apache.pekko.actor.ActorSystem;
import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException;
import org.eclipse.ditto.base.model.headers.DittoHeaderDefinition;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
Expand Down Expand Up @@ -98,8 +99,6 @@
import org.eclipse.ditto.wot.model.WotThingModelInvalidException;
import org.eclipse.ditto.wot.model.WotThingModelPlaceholderUnresolvedException;

import org.apache.pekko.actor.ActorSystem;

/**
* Default Ditto specific implementation of {@link WotThingDescriptionGenerator}.
*/
Expand Down Expand Up @@ -311,9 +310,9 @@ private void removeTmRequired(final ThingModel.Builder builder) {
private void addBase(final ThingDescription.Builder thingDescriptionBuilder,
final ThingId thingId, @Nullable final String featureId) {
if (null != featureId) {
final String featurePath = "/features/" + featureId;
thingDescriptionBuilder.setId(IRI.of("urn:" + thingId + featurePath))
.setBase(IRI.of(buildThingIdBasePath(thingId) + featurePath));
final String featurePath = "features/" + featureId;
thingDescriptionBuilder.setId(IRI.of("urn:" + thingId + "/" + featurePath))
.setBase(IRI.of(buildThingIdBasePath(thingId) + featurePath + "/"));
} else {
thingDescriptionBuilder.setId(IRI.of("urn:" + thingId))
.setBase(IRI.of(buildThingIdBasePath(thingId)));
Expand All @@ -331,7 +330,7 @@ private void addInstanceVersion(final ThingDescription.Builder thingDescriptionB
}

private String buildThingIdBasePath(final ThingId thingId) {
return toThingDescriptionConfig.getBasePrefix() + "/api/2/things/" + thingId;
return toThingDescriptionConfig.getBasePrefix() + "/api/2/things/" + thingId + "/";
}

private void addThingDescriptionLinks(final ThingDescription.Builder tdBuilder, final URL tmUrl,
Expand Down Expand Up @@ -372,7 +371,7 @@ private void convertThingDescriptionTmSubmodelLinksToItems(final ThingDescriptio
return Link.newBuilder()
.setRel("item")
.setType(ContentType.APPLICATION_TD_JSON.getValue())
.setHref(IRI.of("/features/" + link.getValue(TM_SUBMODEL_INSTANCE_NAME)
.setHref(IRI.of("features/" + link.getValue(TM_SUBMODEL_INSTANCE_NAME)
.filter(JsonValue::isString)
.map(JsonValue::asString)
.orElseThrow(() -> WotThingModelInvalidException
Expand Down Expand Up @@ -436,11 +435,12 @@ private void generateRootForms(final ThingModel thingModel,
DITTO_FIELDS_URI_VARIABLE,
DittoHeaderDefinition.CHANNEL.getKey(),
DittoHeaderDefinition.TIMEOUT.getKey());
final String hrefWithoutLeadingSlash = propertiesPath.toString().substring(1);
if (thingModelForms.isPresent()) {
tdBuilder.setForms(thingModelForms.get()
.stream()
.map(rfe -> RootFormElement.fromJson(rfe.toBuilder()
.setHref(IRI.of(propertiesPath))
.setHref(IRI.of(hrefWithoutLeadingSlash))
.setAdditionalResponses(provideAdditionalResponses())
.build()
))
Expand All @@ -449,27 +449,27 @@ private void generateRootForms(final ThingModel thingModel,
} else {
tdBuilder.setForms(List.of(
buildRootFormElement(SingleRootFormElementOp.READALLPROPERTIES,
propertiesPath + readUriVariablesParams,
hrefWithoutLeadingSlash + readUriVariablesParams,
"GET"
),
buildRootFormElement(SingleRootFormElementOp.READMULTIPLEPROPERTIES,
propertiesPath + readMultiplePropertiesUriVariablesParams,
hrefWithoutLeadingSlash + readMultiplePropertiesUriVariablesParams,
"GET"
),
buildRootFormElement(SingleRootFormElementOp.WRITEALLPROPERTIES,
propertiesPath + writeUriVariablesParams,
hrefWithoutLeadingSlash + writeUriVariablesParams,
"PUT"
),
buildRootFormElement(SingleRootFormElementOp.WRITEMULTIPLEPROPERTIES,
propertiesPath + writeUriVariablesParams,
hrefWithoutLeadingSlash + writeUriVariablesParams,
"PATCH",
builder -> builder.setContentType(ContentType.APPLICATION_MERGE_PATCH_JSON.getValue())
),
buildRootFormElement(List.of(
SingleRootFormElementOp.OBSERVEALLPROPERTIES,
SingleRootFormElementOp.UNOBSERVEALLPROPERTIES
),
propertiesPath,
hrefWithoutLeadingSlash,
"GET",
builder -> builder
.setSubprotocol(SUBPROTOCOL_SSE)
Expand All @@ -479,7 +479,7 @@ private void generateRootForms(final ThingModel thingModel,
SingleRootFormElementOp.SUBSCRIBEALLEVENTS,
SingleRootFormElementOp.UNSUBSCRIBEALLEVENTS
),
JsonPointer.of("/outbox/messages"),
"outbox/messages",
"GET",
builder -> builder
.setSubprotocol(SUBPROTOCOL_SSE)
Expand Down Expand Up @@ -512,7 +512,7 @@ private RootFormElement buildRootFormElement(final SingleRootFormElementOp op,
}

private RootFormElement buildRootFormElement(final Collection<SingleRootFormElementOp> ops,
final JsonPointer hrefPointer,
final CharSequence hrefPointer,
final String htvMethodName,
final Consumer<RootFormElement.Builder> builderConsumer
) {
Expand Down Expand Up @@ -557,11 +557,12 @@ private void generatePropertiesForms(final ThingModel thingModel,
final String readUriVariablesParams = provideUriVariablesBag(
DittoHeaderDefinition.CHANNEL.getKey(),
DittoHeaderDefinition.TIMEOUT.getKey());
final String hrefWithoutLeadingSlash = propertyHref.toString().substring(1);
return property.getForms()
.map(propertyFormElements -> property.toBuilder()
.setForms(PropertyForms.of(propertyFormElements.stream()
.map(pfe -> pfe.toBuilder()
.setHref(IRI.of(propertyHref))
.setHref(IRI.of(hrefWithoutLeadingSlash))
.setAdditionalResponses(provideAdditionalResponses())
.build()
)
Expand All @@ -573,18 +574,18 @@ private void generatePropertiesForms(final ThingModel thingModel,
final List<PropertyFormElement> formElements = new ArrayList<>();
if (!property.isWriteOnly()) {
formElements.add(buildPropertyFormElement(SinglePropertyFormElementOp.READPROPERTY,
propertyHref + readUriVariablesParams,
hrefWithoutLeadingSlash + readUriVariablesParams,
"GET"
));
}

if (!property.isReadOnly()) {
formElements.add(buildPropertyFormElement(SinglePropertyFormElementOp.WRITEPROPERTY,
propertyHref + writeUriVariablesParams,
hrefWithoutLeadingSlash + writeUriVariablesParams,
"PUT"
));
formElements.add(buildPropertyFormElement(SinglePropertyFormElementOp.WRITEPROPERTY,
propertyHref + writeUriVariablesParams,
hrefWithoutLeadingSlash + writeUriVariablesParams,
"PATCH",
builder -> builder
.setContentType(
Expand All @@ -599,7 +600,7 @@ private void generatePropertiesForms(final ThingModel thingModel,
SinglePropertyFormElementOp.OBSERVEPROPERTY,
SinglePropertyFormElementOp.UNOBSERVEPROPERTY
),
propertyHref,
hrefWithoutLeadingSlash,
"GET",
builder -> builder
.setSubprotocol(SUBPROTOCOL_SSE)
Expand Down Expand Up @@ -725,7 +726,7 @@ private void generateActionsForms(final ThingModel thingModel,
.map(actions -> actions.map(actionEntry -> {
final String actionName = actionEntry.getKey();
final Action action = actionEntry.getValue();
final JsonPointer actionHref = JsonPointer.of("/inbox/messages/" + actionName);
final String actionHrefWithoutLeadingSlash = "inbox/messages/" + actionName;
final String uriVariablesParams = provideUriVariablesBag(
DittoHeaderDefinition.TIMEOUT.getKey(),
DittoHeaderDefinition.RESPONSE_REQUIRED.getKey());
Expand All @@ -734,7 +735,7 @@ private void generateActionsForms(final ThingModel thingModel,
.setSynchronous(true)
.setForms(ActionForms.of(actionFormElements.stream()
.map(afe -> afe.toBuilder()
.setHref(IRI.of(actionHref))
.setHref(IRI.of(actionHrefWithoutLeadingSlash))
.setAdditionalResponses(provideAdditionalResponses())
.build()
)
Expand All @@ -746,7 +747,7 @@ private void generateActionsForms(final ThingModel thingModel,
.setSynchronous(true)
.setForms(ActionForms.of(List.of(
buildActionFormElement(SingleActionFormElementOp.INVOKEACTION,
actionHref + uriVariablesParams)
actionHrefWithoutLeadingSlash + uriVariablesParams)
)))
.build()
);
Expand Down Expand Up @@ -788,12 +789,12 @@ private void generateEventsForms(final ThingModel thingModel, final ThingDescrip
.map(events -> events.map(eventEntry -> {
final String eventName = eventEntry.getKey();
final Event event = eventEntry.getValue();
final JsonPointer eventHref = JsonPointer.of("/outbox/messages/" + eventName);
final String eventHrefWithoutLeadingSlash = "outbox/messages/" + eventName;
return event.getForms()
.map(eventFormElements -> event.toBuilder()
.setForms(EventForms.of(eventFormElements.stream()
.map(efe -> efe.toBuilder()
.setHref(IRI.of(eventHref))
.setHref(IRI.of(eventHrefWithoutLeadingSlash))
.setAdditionalResponses(provideAdditionalResponses())
.build()
)
Expand All @@ -803,7 +804,8 @@ private void generateEventsForms(final ThingModel thingModel, final ThingDescrip
)
.orElseGet(() -> event.toBuilder()
.setForms(EventForms.of(List.of(
buildEventFormElement(SingleEventFormElementOp.SUBSCRIBEEVENT, eventHref)
buildEventFormElement(SingleEventFormElementOp.SUBSCRIBEEVENT,
eventHrefWithoutLeadingSlash)
)))
.build()
);
Expand All @@ -814,7 +816,7 @@ private void generateEventsForms(final ThingModel thingModel, final ThingDescrip
}

private EventFormElement buildEventFormElement(final SingleEventFormElementOp op,
final JsonPointer hrefPointer
final CharSequence hrefPointer
) {
return EventFormElement.newBuilder()
.setOp(op)
Expand Down Expand Up @@ -887,7 +889,8 @@ private Optional<JsonValue> resolvePlaceholder(final String value, @Nullable fin
final String placeholderToResolve = matcher.group(TM_PLACEHOLDER_PL_GROUP).trim();
if (null != modelPlaceholders) {
return modelPlaceholders.getValue(placeholderToResolve)
.or(() -> Optional.ofNullable(toThingDescriptionConfig.getPlaceholders().get(placeholderToResolve)));
.or(() -> Optional.ofNullable(
toThingDescriptionConfig.getPlaceholders().get(placeholderToResolve)));
} else {
return Optional.ofNullable(toThingDescriptionConfig.getPlaceholders().get(placeholderToResolve));
}
Expand Down

0 comments on commit 80b89f3

Please sign in to comment.