Skip to content

Commit 423241d

Browse files
committed
inverted logic & tests
Signed-off-by: Jakub Amanowicz <[email protected]>
1 parent d15a510 commit 423241d

File tree

19 files changed

+209
-167
lines changed

19 files changed

+209
-167
lines changed

here-naksha-lib-core/src/main/java/com/here/naksha/lib/core/models/geojson/implementation/namespaces/HereDeltaNs.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
@SuppressWarnings({"UnusedReturnValue", "unused"})
2828
public class HereDeltaNs extends JsonObject {
2929

30+
public static final String CHANGE_STATE_PROPERTY = "changeState";
31+
public static final String REVIEW_STATE_PROPERTY = "reviewState";
32+
3033
/**
3134
* Create a new default delta namespace for new features.
3235
*/
@@ -43,8 +46,8 @@ public HereDeltaNs() {
4346
*/
4447
@JsonCreator
4548
public HereDeltaNs(
46-
@JsonProperty("changeState") @Nullable EChangeState changeState,
47-
@JsonProperty("reviewState") @Nullable EReviewState reviewState) {
49+
@JsonProperty(CHANGE_STATE_PROPERTY) @Nullable EChangeState changeState,
50+
@JsonProperty(REVIEW_STATE_PROPERTY) @Nullable EReviewState reviewState) {
4851
if (changeState == null) {
4952
changeState = EChangeState.CREATED;
5053
}

here-naksha-lib-mom10/src/main/java/com/here/naksha/mom10/MetaProperties.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,15 @@ private MetaProperties() {}
4242
*/
4343
public static final String CONFIDENCE = "confidence";
4444

45+
/**
46+
* TODO
47+
*/
4548
public static final String EXTERNAL_IDS = "externalIds";
4649

50+
public static final String SOURCE_INFO = "sourceInfo";
51+
4752
/**
48-
* SOurce of truth about model version - required since MOM 10.0.0
53+
* Source of truth about model version - required since MOM 10.0.0
4954
*/
5055
public static final String MODEL_VERSION = "modelVersion";
5156
}

here-naksha-lib-mom10/src/main/java/com/here/naksha/mom10/handler/FromMom10TransformationHandler.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@
3535
import java.util.List;
3636
import org.jetbrains.annotations.NotNull;
3737

38+
/**
39+
* Handler responsible for populating outdated (pre MOM 10) namespaces: `@ns:com:here:mom:meta` and '@ns:com:here:mom:meta`.
40+
* The feature modification happens in-place, no other properties are modified.
41+
* This handler works only for features of MOM version 10 and above. It is intended to be part of the writing pipeline.
42+
* Reading of features process with this handler should be done with use of {@link ToMom10TransformationHandler}
43+
*/
3844
public final class FromMom10TransformationHandler extends AbstractEventHandler {
3945

4046
public FromMom10TransformationHandler(@NotNull INaksha hub) {
@@ -54,7 +60,7 @@ protected EventProcessingStrategy processingStrategyFor(IEvent event) {
5460
TransformFromMom10Request request = (TransformFromMom10Request) event.getRequest();
5561
List<XyzFeature> features = featuresOrEmptyList(request);
5662
try {
57-
features.forEach(this::validateVersionAndDropMeta);
63+
features.forEach(this::validateVersionAndPopulatePreMom10Namespaces);
5864
} catch (IllegalArgumentException iae) {
5965
return new ErrorResult(XyzError.ILLEGAL_ARGUMENT, "MOM 10 transformation failed", iae);
6066
}
@@ -69,9 +75,9 @@ private List<XyzFeature> featuresOrEmptyList(TransformFromMom10Request request)
6975
return features;
7076
}
7177

72-
private void validateVersionAndDropMeta(@NotNull XyzFeature feature) {
78+
private void validateVersionAndPopulatePreMom10Namespaces(@NotNull XyzFeature feature) {
7379
if (Mom10Verification.isMom10OrGreater(feature)) {
74-
Mom10Transformation.dropMom10Meta(feature);
80+
Mom10Transformation.populatePreMom10Namespaces(feature);
7581
} else {
7682
throw new IllegalArgumentException("Feature '" + feature.getId() + "' has version < 10.0.0");
7783
}

here-naksha-lib-mom10/src/main/java/com/here/naksha/mom10/handler/ToMom10TransformationHandler.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@
3434
import java.util.List;
3535
import org.jetbrains.annotations.NotNull;
3636

37+
/**
38+
* Handler responsible for dropping outdated (pre MOM 10) namespaces: `@ns:com:here:mom:meta` and '@ns:com:here:mom:meta`.
39+
* The feature modification happens in-place, no other properties are modified.
40+
* This handler works only for features of MOM version 10 and above and should be used only for reading features that were previously written with use of {@link FromMom10TransformationHandler}
41+
*/
3742
public final class ToMom10TransformationHandler extends AbstractEventHandler {
3843

3944
public ToMom10TransformationHandler(@NotNull INaksha hub) {
@@ -53,7 +58,7 @@ protected EventProcessingStrategy processingStrategyFor(IEvent event) {
5358
TransformToMom10Request request = (TransformToMom10Request) event.getRequest();
5459
List<XyzFeature> features = featuresOrEmptyList(request);
5560
try {
56-
features.forEach(this::validateVersionAndPopulateMeta);
61+
features.forEach(this::validateVersionAndDropPreMom10Namespaces);
5762
} catch (IllegalArgumentException iae) {
5863
return new ErrorResult(XyzError.ILLEGAL_ARGUMENT, "MOM 10 transformation failed", iae);
5964
}
@@ -68,10 +73,11 @@ private List<XyzFeature> featuresOrEmptyList(TransformToMom10Request request) {
6873
return features;
6974
}
7075

71-
private void validateVersionAndPopulateMeta(@NotNull XyzFeature feature) {
76+
private void validateVersionAndDropPreMom10Namespaces(@NotNull XyzFeature feature) {
7277
if (Mom10Verification.isMom10OrGreater(feature)) {
73-
throw new IllegalArgumentException("Feature '" + feature.getId() + "' has version >= 10.0.0");
78+
Mom10Transformation.dropPreMom10Namespaces(feature);
79+
} else {
80+
throw new IllegalArgumentException("Feature '" + feature.getId() + "' has version < 10.0.0");
7481
}
75-
Mom10Transformation.populateMom10Meta(feature);
7682
}
7783
}

here-naksha-lib-mom10/src/main/java/com/here/naksha/mom10/transform/Mom10Transformation.java

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,66 +22,71 @@
2222
import static com.here.naksha.mom10.MetaProperties.EXTERNAL_IDS;
2323
import static com.here.naksha.mom10.MetaProperties.META;
2424
import static com.here.naksha.mom10.MetaProperties.MODERATION_INFO;
25+
import static com.here.naksha.mom10.MetaProperties.SOURCE_INFO;
2526

2627
import com.here.naksha.lib.core.models.geojson.implementation.XyzFeature;
2728
import com.here.naksha.lib.core.models.geojson.implementation.XyzProperties;
29+
import com.here.naksha.lib.core.models.geojson.implementation.namespaces.EChangeState;
30+
import com.here.naksha.lib.core.models.geojson.implementation.namespaces.EReviewState;
31+
import com.here.naksha.lib.core.models.geojson.implementation.namespaces.HereDeltaNs;
32+
import com.here.naksha.lib.core.models.geojson.implementation.namespaces.HereMetaNs;
2833
import com.here.naksha.lib.core.util.json.JsonObject;
34+
import java.util.Map;
2935
import java.util.Set;
36+
import org.jetbrains.annotations.NotNull;
3037
import org.jetbrains.annotations.Nullable;
3138

3239
public class Mom10Transformation {
3340
private Mom10Transformation() {}
3441

35-
public static void populateMom10Meta(@Nullable XyzFeature feature) {
42+
public static void populatePreMom10Namespaces(@Nullable XyzFeature feature) {
3643
if (feature == null) {
3744
return;
3845
}
46+
3947
XyzProperties properties = feature.getProperties();
40-
if (properties.containsKey(META)) {
41-
throw new IllegalArgumentException(
42-
"This feature (id= " + feature.getId() + ") already contains the '" + META + "' property");
43-
}
48+
Map<String, Object> meta = (Map<String, Object>) properties.get(META);
49+
if (meta != null) {
50+
Map<String, Object> moderationInfo = (Map<String, Object>) meta.get(MODERATION_INFO);
51+
if (moderationInfo != null) {
52+
HereDeltaNs deltaNs = deltaNsFromModerationInfo(moderationInfo);
53+
properties.setDeltaNamespace(deltaNs);
54+
}
4455

45-
JsonObject oldMetaNs = properties.getMetaNamespace();
46-
JsonObject mom10Meta;
47-
if (oldMetaNs != null) {
48-
mom10Meta = oldMetaNs.deepClone();
49-
drop(mom10Meta, OutdatedProperties.OUTDATED_META_PROPERTIES);
50-
} else {
51-
mom10Meta = new JsonObject();
56+
if (!meta.isEmpty()) {
57+
HereMetaNs metaNs = new HereMetaNs();
58+
metaNs.putAll(meta);
59+
// remove properties that before MOM 10 lived in root properties
60+
metaNs.remove(CONFIDENCE);
61+
metaNs.remove(MODERATION_INFO);
62+
metaNs.remove(SOURCE_INFO);
63+
properties.setMetaNamespace(metaNs);
64+
}
5265
}
66+
}
5367

54-
JsonObject oldDeltaNs = properties.getDeltaNamespace();
55-
if (oldDeltaNs != null) {
56-
JsonObject mom10ModerationInfo = oldDeltaNs.deepClone();
57-
drop(mom10ModerationInfo, OutdatedProperties.OUTDATED_DELTA_PROPERTIES);
58-
mom10Meta.put(MODERATION_INFO, mom10ModerationInfo);
68+
private static HereDeltaNs deltaNsFromModerationInfo(@NotNull Map<String, Object> moderationInfo) {
69+
HereDeltaNs deltaNs = new HereDeltaNs();
70+
String rawChangeState = (String) moderationInfo.get(HereDeltaNs.CHANGE_STATE_PROPERTY);
71+
if (rawChangeState != null) {
72+
deltaNs.setChangeState(EChangeState.get(EChangeState.class, rawChangeState));
5973
}
60-
61-
Object confidence = properties.get(CONFIDENCE);
62-
if (confidence != null) {
63-
mom10Meta.put(CONFIDENCE, confidence);
74+
String rawReviewState = (String) moderationInfo.get(HereDeltaNs.REVIEW_STATE_PROPERTY);
75+
if (rawChangeState != null) {
76+
deltaNs.setReviewState(EReviewState.get(EReviewState.class, rawReviewState));
6477
}
65-
66-
Object externalIds = properties.get(EXTERNAL_IDS);
67-
if (externalIds != null) {
68-
mom10Meta.put(EXTERNAL_IDS, externalIds);
78+
for (Map.Entry<String, Object> entry : moderationInfo.entrySet()) {
79+
if (!entry.getKey().equals(HereDeltaNs.CHANGE_STATE_PROPERTY)
80+
&& !entry.getKey().equals(HereDeltaNs.REVIEW_STATE_PROPERTY)) {
81+
deltaNs.put(entry.getKey(), entry.getValue());
82+
}
6983
}
70-
71-
properties.put(META, mom10Meta);
84+
return deltaNs;
7285
}
7386

74-
public static void dropMom10Meta(@Nullable XyzFeature feature) {
75-
if (feature == null) {
76-
return;
77-
}
87+
public static void dropPreMom10Namespaces(@Nullable XyzFeature feature) {
7888
XyzProperties properties = feature.getProperties();
79-
properties.remove(META);
80-
}
81-
82-
private static void drop(JsonObject bearer, Set<String> propertyNames) {
83-
for (String propertyName : propertyNames) {
84-
bearer.remove(propertyName);
85-
}
89+
properties.remove(XyzProperties.HERE_META_NS);
90+
properties.remove(XyzProperties.HERE_DELTA_NS);
8691
}
8792
}

here-naksha-lib-mom10/src/test/java/com/here/naksha/mom10/TransformationSamples.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ private TransformationSamples() {
2020

2121
public record TransformationSample(
2222
String sourceDir,
23-
XyzFeature original,
24-
XyzFeature transformed
23+
XyzFeature mom10,
24+
XyzFeature nakshaInternal
2525
) {
2626

2727
@Override
@@ -46,16 +46,16 @@ private static List<TransformationSample> getSamples() {
4646
private static TransformationSample copy(TransformationSample base) {
4747
return new TransformationSample(
4848
base.sourceDir,
49-
base.original.deepClone(),
50-
base.transformed.deepClone()
49+
base.mom10.deepClone(),
50+
base.nakshaInternal.deepClone()
5151
);
5252
}
5353

5454
private static class SamplesLoader {
5555

5656
private static final String TEST_DIR = "/transformation_samples";
57-
private static final String ORIGINAL_JSON = "original.json";
58-
private static final String TRANSFORMED_JSON = "transformed.json";
57+
private static final String MOM_10_JSON = "mom_10.json";
58+
private static final String NAKSHA_INTERNAL_JSON = "naksha_internal.json";
5959

6060
// initialization on demand
6161
private static final List<TransformationSample> LOADED_SAMPLES;
@@ -80,8 +80,8 @@ private static List<Path> samplesDirs() {
8080

8181
private static TransformationSample loadSampleFrom(Path dir) {
8282
try {
83-
byte[] rawBefore = readAllBytes(dir.resolve(ORIGINAL_JSON));
84-
byte[] rawAfter = readAllBytes(dir.resolve(TRANSFORMED_JSON));
83+
byte[] rawBefore = readAllBytes(dir.resolve(MOM_10_JSON));
84+
byte[] rawAfter = readAllBytes(dir.resolve(NAKSHA_INTERNAL_JSON));
8585
return new TransformationSample(
8686
dir.getFileName().toString(),
8787
JsonSerializable.deserialize(rawBefore, XyzFeature.class),

here-naksha-lib-mom10/src/test/java/com/here/naksha/mom10/handler/FromMom10TransformationHandlerTest.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.here.naksha.mom10.handler;
22

3+
import static com.here.naksha.mom10.TransformationSamples.streamSamples;
34
import static com.here.naksha.mom10.util.FeaturesAssertionUtil.assertFeaturesEqual;
45
import static org.junit.jupiter.api.Assertions.assertEquals;
56
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -13,6 +14,7 @@
1314
import com.here.naksha.lib.core.models.storage.Request;
1415
import com.here.naksha.lib.core.models.storage.Result;
1516
import com.here.naksha.lib.core.util.storage.ResultHelper;
17+
import com.here.naksha.mom10.TransformationSamples;
1618
import com.here.naksha.mom10.TransformationSamples.TransformationSample;
1719
import com.here.naksha.mom10.handler.TransformationSuccess.FromMom10;
1820
import java.util.ArrayList;
@@ -28,17 +30,17 @@ class FromMom10TransformationHandlerTest extends TransformationHandlerTest {
2830
private final FromMom10TransformationHandler handler = new FromMom10TransformationHandler(naksha);
2931

3032
@Test
31-
void shouldDropMetaFromFeatures() throws NoCursor {
33+
void shouldPopulatePreMom10Namespaces() throws NoCursor {
3234
// Given
33-
List<XyzFeature> inputFeaturesWithMeta = new ArrayList<>();
34-
List<XyzFeature> expectedFeaturesWithoutMeta = new ArrayList<>();
35-
samplesWithModelVersion("10.0.0").forEach(sample -> {
36-
inputFeaturesWithMeta.add(sample.transformed());
37-
expectedFeaturesWithoutMeta.add(sample.original());
35+
List<XyzFeature> mom10Features = new ArrayList<>();
36+
List<XyzFeature> nakshaInternalFeatures = new ArrayList<>();
37+
streamSamples().forEach(sample -> {
38+
mom10Features.add(sample.mom10());
39+
nakshaInternalFeatures.add(sample.nakshaInternal());
3840
});
3941

4042
// And
41-
IEvent event = event(new TransformFromMom10Request(inputFeaturesWithMeta));
43+
IEvent event = event(new TransformFromMom10Request(mom10Features));
4244

4345
// When
4446
Result result = handler.processEvent(event);
@@ -48,9 +50,9 @@ void shouldDropMetaFromFeatures() throws NoCursor {
4850

4951
// And
5052
List<XyzFeature> handledFeatures = ResultHelper.readFeaturesFromResult(success, XyzFeature.class);
51-
assertEquals(expectedFeaturesWithoutMeta.size(), handledFeatures.size());
52-
for (int i = 0; i < expectedFeaturesWithoutMeta.size(); i++) {
53-
assertFeaturesEqual(expectedFeaturesWithoutMeta.get(i), handledFeatures.get(i));
53+
assertEquals(nakshaInternalFeatures.size(), handledFeatures.size());
54+
for (int i = 0; i < nakshaInternalFeatures.size(); i++) {
55+
assertFeaturesEqual(nakshaInternalFeatures.get(i), handledFeatures.get(i));
5456
}
5557
}
5658

@@ -85,7 +87,7 @@ void shouldSucceedOnEmptyRequest(List<XyzFeature> noFeatures) throws NoCursor {
8587
@Test
8688
void shouldFailWhenVersionTooLow() {
8789
// Given:
88-
List<XyzFeature> featuresWithVersionTooLow = samplesWithModelVersion("9.0.0").map(TransformationSample::transformed).toList();
90+
List<XyzFeature> featuresWithVersionTooLow = samplesWithModelVersion("9.0.0").map(TransformationSample::nakshaInternal).toList();
8991
IEvent event = event(new TransformFromMom10Request(featuresWithVersionTooLow));
9092

9193
// When: handling empty event

here-naksha-lib-mom10/src/test/java/com/here/naksha/mom10/handler/ToMom10TransformationHandlerTest.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.here.naksha.mom10.handler;
22

3+
import static com.here.naksha.mom10.TransformationSamples.streamSamples;
34
import static com.here.naksha.mom10.util.FeaturesAssertionUtil.assertFeaturesEqual;
4-
import static org.junit.jupiter.api.Assertions.*;
5+
import static org.junit.jupiter.api.Assertions.assertEquals;
6+
import static org.junit.jupiter.api.Assertions.assertFalse;
7+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
58

69
import com.here.naksha.lib.core.IEvent;
710
import com.here.naksha.lib.core.exceptions.NoCursor;
@@ -12,9 +15,7 @@
1215
import com.here.naksha.lib.core.models.storage.Result;
1316
import com.here.naksha.lib.core.util.storage.ResultHelper;
1417
import com.here.naksha.mom10.TransformationSamples.TransformationSample;
15-
import com.here.naksha.mom10.handler.TransformationSuccess.FromMom10;
1618
import com.here.naksha.mom10.handler.TransformationSuccess.ToMom10;
17-
import com.here.naksha.mom10.util.FeaturesAssertionUtil;
1819
import java.util.ArrayList;
1920
import java.util.List;
2021
import java.util.stream.Stream;
@@ -28,17 +29,17 @@ class ToMom10TransformationHandlerTest extends TransformationHandlerTest {
2829
private final ToMom10TransformationHandler handler = new ToMom10TransformationHandler(naksha);
2930

3031
@Test
31-
void shouldPopulateMetaInFeatures() throws NoCursor {
32+
void shouldDropPreMom10Namespaces() throws NoCursor {
3233
// Given
33-
List<XyzFeature> preMom10Features = new ArrayList<>();
34-
List<XyzFeature> expectedFeaturesWithMeta = new ArrayList<>();
35-
samplesWithModelVersion("9.9.7").forEach(sample -> {
36-
preMom10Features.add(sample.original());
37-
expectedFeaturesWithMeta.add(sample.transformed());
34+
List<XyzFeature> nakshaInternalFeatures = new ArrayList<>();
35+
List<XyzFeature> mom10Features = new ArrayList<>();
36+
streamSamples().forEach(sample -> {
37+
nakshaInternalFeatures.add(sample.nakshaInternal());
38+
mom10Features.add(sample.mom10());
3839
});
3940

4041
// And
41-
IEvent event = event(new TransformToMom10Request(preMom10Features));
42+
IEvent event = event(new TransformToMom10Request(nakshaInternalFeatures));
4243

4344
// When
4445
Result result = handler.processEvent(event);
@@ -48,9 +49,9 @@ void shouldPopulateMetaInFeatures() throws NoCursor {
4849

4950
// And
5051
List<XyzFeature> handledFeatures = ResultHelper.readFeaturesFromResult(success, XyzFeature.class);
51-
assertEquals(expectedFeaturesWithMeta.size(), handledFeatures.size());
52-
for (int i = 0; i < expectedFeaturesWithMeta.size(); i++) {
53-
assertFeaturesEqual(expectedFeaturesWithMeta.get(i), handledFeatures.get(i));
52+
assertEquals(mom10Features.size(), handledFeatures.size());
53+
for (int i = 0; i < mom10Features.size(); i++) {
54+
assertFeaturesEqual(mom10Features.get(i), handledFeatures.get(i));
5455
}
5556
}
5657

@@ -83,9 +84,9 @@ void shouldSucceedOnEmptyRequest(List<XyzFeature> noFeatures) throws NoCursor {
8384
}
8485

8586
@Test
86-
void shouldFailWhenVersionTooHigh() {
87+
void shouldFailWhenVersionTooLow() {
8788
// Given:
88-
List<XyzFeature> featuresWithVersionTooHigh = samplesWithModelVersion("10.0.0").map(TransformationSample::transformed).toList();
89+
List<XyzFeature> featuresWithVersionTooHigh = samplesWithModelVersion("9.9.7").map(TransformationSample::nakshaInternal).toList();
8990
IEvent event = event(new TransformToMom10Request(featuresWithVersionTooHigh));
9091

9192
// When: handling empty event

0 commit comments

Comments
 (0)