Skip to content

Commit 56eb19b

Browse files
authored
Merge pull request #2069 from beyonnex-io/bugfix/tm-submodel-via-extends
Fix resolving WoT submodels from extended model
2 parents c3a1855 + adf7f2f commit 56eb19b

File tree

2 files changed

+46
-3
lines changed

2 files changed

+46
-3
lines changed

bom/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
<!-- ### Compile dependencies versions -->
3535
<minimal-json.version>0.9.5</minimal-json.version>
3636
<jackson-bom.version>2.17.2</jackson-bom.version>
37-
<json-schema-validator.version>1.5.1</json-schema-validator.version>
37+
<json-schema-validator.version>1.5.4</json-schema-validator.version>
3838
<typesafe-config.version>1.4.3</typesafe-config.version>
3939
<ssl-config-core.version>0.6.1</ssl-config-core.version>
4040
<kafka-client.version>3.7.1</kafka-client.version>

wot/api/src/main/java/org/eclipse/ditto/wot/api/generator/DefaultWotThingModelExtensionResolver.java

+45-2
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
import static org.eclipse.ditto.base.model.common.ConditionChecker.checkNotNull;
1616

1717
import java.util.List;
18+
import java.util.Optional;
1819
import java.util.concurrent.CompletableFuture;
1920
import java.util.concurrent.CompletionStage;
2021
import java.util.concurrent.Executor;
2122
import java.util.function.BiFunction;
23+
import java.util.stream.Stream;
2224

2325
import org.eclipse.ditto.base.model.headers.DittoHeaders;
2426
import org.eclipse.ditto.json.JsonCollectors;
@@ -28,7 +30,9 @@
2830
import org.eclipse.ditto.json.JsonPointer;
2931
import org.eclipse.ditto.json.JsonValue;
3032
import org.eclipse.ditto.wot.api.provider.WotThingModelFetcher;
33+
import org.eclipse.ditto.wot.model.BaseLink;
3134
import org.eclipse.ditto.wot.model.IRI;
35+
import org.eclipse.ditto.wot.model.Links;
3236
import org.eclipse.ditto.wot.model.ThingModel;
3337
import org.eclipse.ditto.wot.model.WotThingModelRefInvalidException;
3438

@@ -73,7 +77,7 @@ public CompletionStage<ThingModel> resolveThingModelExtensions(final ThingModel
7377
return CompletableFuture.completedFuture(thingModel);
7478
} else {
7579
CompletionStage<ThingModel.Builder> currentStage =
76-
resolveThingModelExtensions(extendedModels.get(0), dittoHeaders) // recurse!
80+
resolveThingModelExtensions(extendedModels.getFirst(), dittoHeaders) // recurse!
7781
.thenApply(extendedModel ->
7882
mergeThingModelIntoBuilder().apply(tmBuilder, extendedModel)
7983
);
@@ -91,13 +95,52 @@ public CompletionStage<ThingModel> resolveThingModelExtensions(final ThingModel
9195

9296
private BiFunction<ThingModel.Builder, ThingModel, ThingModel.Builder> mergeThingModelIntoBuilder() {
9397
return (builder, model) -> {
94-
final JsonObject mergedTmObject = JsonFactory.mergeJsonValues(builder.build(), model).asObject();
98+
final ThingModel newModel = builder.build();
99+
final JsonObject mergedTmObject = JsonFactory.mergeJsonValues(newModel, model).asObject();
95100
builder.removeAll();
96101
builder.setAll(mergedTmObject);
102+
mergeLinks(model.getLinks(), newModel.getLinks()).ifPresent(builder::setLinks);
97103
return builder;
98104
};
99105
}
100106

107+
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
108+
private static Optional<Links> mergeLinks(final Optional<Links> oldOptionalLinks,
109+
final Optional<Links> newOptionalLinks)
110+
{
111+
return oldOptionalLinks
112+
.map(oldLinks -> filterOutTmExtendsLinkFromOldLinks(newOptionalLinks, oldLinks))
113+
.map(adjustedOldLinks ->
114+
newOptionalLinks.stream()
115+
.flatMap(newLinks -> Stream.concat(adjustedOldLinks, newLinks.stream()))
116+
)
117+
.map(Stream::toList)
118+
.map(Links::of);
119+
}
120+
121+
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
122+
private static Stream<BaseLink<?>> filterOutTmExtendsLinkFromOldLinks(final Optional<Links> newOptionalLinks,
123+
final Links oldLinks)
124+
{
125+
return oldLinks.stream()
126+
.filter(oldLink -> {
127+
if (isTmExtendsLink(oldLink)) {
128+
return newOptionalLinks.filter(DefaultWotThingModelExtensionResolver::containsTmExtendsLink)
129+
.isEmpty();
130+
} else {
131+
return true;
132+
}
133+
});
134+
}
135+
136+
private static boolean containsTmExtendsLink(final Links links) {
137+
return links.stream().anyMatch(DefaultWotThingModelExtensionResolver::isTmExtendsLink);
138+
}
139+
140+
private static boolean isTmExtendsLink(final BaseLink<?> link) {
141+
return link.getRel().isPresent() && link.getRel().filter(TM_EXTENDS::equals).isPresent();
142+
}
143+
101144
@Override
102145
public CompletionStage<ThingModel> resolveThingModelRefs(final ThingModel thingModel, final DittoHeaders dittoHeaders) {
103146
return potentiallyResolveRefs(thingModel, dittoHeaders).thenApply(ThingModel::fromJson);

0 commit comments

Comments
 (0)