Skip to content

Commit 03023ad

Browse files
authored
feat: add type handlers for SimpleUri and BlockUri (#5061)
1 parent f3f9d92 commit 03023ad

File tree

5 files changed

+158
-0
lines changed

5 files changed

+158
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright 2022 The Terasology Foundation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package org.terasology.engine.persistence.typeHandling.extensionTypes;
5+
6+
import org.junit.jupiter.api.Assertions;
7+
import org.junit.jupiter.api.Test;
8+
import org.terasology.engine.world.block.BlockUri;
9+
import org.terasology.engine.world.block.BlockUriParseException;
10+
import org.terasology.gestalt.assets.ResourceUrn;
11+
import org.terasology.gestalt.naming.Name;
12+
import org.terasology.persistence.typeHandling.PersistedData;
13+
import org.terasology.persistence.typeHandling.inMemory.PersistedString;
14+
15+
import java.util.Optional;
16+
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
import static org.junit.jupiter.api.Assertions.assertTrue;
19+
20+
class BlockUriTypeHandlerTest {
21+
22+
private final BlockUriTypeHandler handler = new BlockUriTypeHandler();
23+
24+
@Test
25+
public void testDeserializeValidShortUri() {
26+
PersistedData data = new PersistedString("foo:bar");
27+
Optional<BlockUri> uri = handler.deserialize(data);
28+
assertTrue(uri.isPresent());
29+
assertEquals(new BlockUri(new ResourceUrn("foo", "bar")), uri.get());
30+
}
31+
32+
@Test
33+
public void testDeserializeValidFullUri() {
34+
PersistedData data = new PersistedString("package:family:shapePackage:shapeName.identifier");
35+
Optional<BlockUri> uri = handler.deserialize(data);
36+
assertTrue(uri.isPresent());
37+
assertEquals(new BlockUri(
38+
new ResourceUrn("package", "family"), new ResourceUrn("shapePackage", "shapeName"), new Name("identifier")), uri.get());
39+
}
40+
41+
@Test
42+
public void testDeserializeInvalidUri() {
43+
PersistedData data = new PersistedString("baz");
44+
BlockUriParseException thrown = Assertions.assertThrows(BlockUriParseException.class, () -> {
45+
handler.deserialize(data);
46+
});
47+
48+
Assertions.assertEquals("Could not parse block uri: 'baz'", thrown.getMessage());
49+
}
50+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright 2022 The Terasology Foundation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package org.terasology.engine.persistence.typeHandling.extensionTypes;
5+
6+
import org.junit.jupiter.api.Test;
7+
import org.terasology.engine.core.SimpleUri;
8+
import org.terasology.persistence.typeHandling.PersistedData;
9+
import org.terasology.persistence.typeHandling.inMemory.PersistedString;
10+
11+
import java.util.Optional;
12+
13+
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
import static org.junit.jupiter.api.Assertions.assertTrue;
15+
16+
class SimpleUriTypeHandlerTest {
17+
18+
private final SimpleUriTypeHandler handler = new SimpleUriTypeHandler();
19+
20+
@Test
21+
public void testDeserializeValidUri() {
22+
PersistedData data = new PersistedString("foo:bar");
23+
Optional<SimpleUri> uri = handler.deserialize(data);
24+
assertTrue(uri.isPresent());
25+
assertEquals(new SimpleUri("foo", "bar"), uri.get());
26+
}
27+
28+
@Test
29+
public void testDeserializeInvalidUri() {
30+
PersistedData data = new PersistedString("baz");
31+
Optional<SimpleUri> uri = handler.deserialize(data);
32+
assertTrue(uri.isEmpty());
33+
}
34+
}

engine/src/main/java/org/terasology/engine/persistence/typeHandling/TypeHandlerLibraryImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@
1818
import org.joml.Vector4i;
1919
import org.joml.Vector4ic;
2020
import org.reflections.Reflections;
21+
import org.terasology.engine.core.SimpleUri;
2122
import org.terasology.engine.core.module.ModuleManager;
2223
import org.terasology.engine.math.IntegerRange;
24+
import org.terasology.engine.persistence.typeHandling.extensionTypes.BlockUriTypeHandler;
2325
import org.terasology.engine.persistence.typeHandling.extensionTypes.ChunkMeshTypeHandler;
2426
import org.terasology.engine.persistence.typeHandling.extensionTypes.ColorTypeHandler;
2527
import org.terasology.engine.persistence.typeHandling.extensionTypes.ColorcTypeHandler;
2628
import org.terasology.engine.persistence.typeHandling.extensionTypes.NameTypeHandler;
29+
import org.terasology.engine.persistence.typeHandling.extensionTypes.SimpleUriTypeHandler;
2730
import org.terasology.engine.persistence.typeHandling.extensionTypes.TextureRegionTypeHandler;
2831
import org.terasology.engine.persistence.typeHandling.extensionTypes.UITextureRegionTypeHandler;
2932
import org.terasology.engine.persistence.typeHandling.extensionTypes.factories.AssetTypeHandlerFactory;
@@ -57,6 +60,7 @@
5760
import org.terasology.engine.world.block.BlockArea;
5861
import org.terasology.engine.world.block.BlockAreac;
5962
import org.terasology.engine.world.block.BlockRegion;
63+
import org.terasology.engine.world.block.BlockUri;
6064
import org.terasology.gestalt.naming.Name;
6165
import org.terasology.joml.geom.AABBf;
6266
import org.terasology.joml.geom.AABBi;
@@ -113,6 +117,8 @@ private static void populateWithDefaultHandlers(TypeHandlerLibrary serialization
113117
serializationLibrary.addTypeHandlerFactory(new AssetTypeHandlerFactory());
114118

115119
serializationLibrary.addTypeHandler(Name.class, new NameTypeHandler());
120+
serializationLibrary.addTypeHandler(SimpleUri.class, new SimpleUriTypeHandler());
121+
serializationLibrary.addTypeHandler(BlockUri.class, new BlockUriTypeHandler());
116122
serializationLibrary.addTypeHandler(TextureRegion.class, new TextureRegionTypeHandler());
117123
serializationLibrary.addTypeHandler(UITextureRegion.class, new UITextureRegionTypeHandler());
118124
serializationLibrary.addTypeHandler(ChunkMesh.class, new ChunkMeshTypeHandler());
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright 2022 The Terasology Foundation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package org.terasology.engine.persistence.typeHandling.extensionTypes;
5+
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.terasology.engine.world.block.BlockUri;
9+
import org.terasology.persistence.typeHandling.StringRepresentationTypeHandler;
10+
11+
public class BlockUriTypeHandler extends StringRepresentationTypeHandler<BlockUri> {
12+
13+
private static final Logger logger = LoggerFactory.getLogger(BlockUriTypeHandler.class);
14+
15+
@Override
16+
public String getAsString(BlockUri uri) {
17+
if (uri == null) {
18+
return "";
19+
}
20+
return uri.toString();
21+
}
22+
23+
@Override
24+
public BlockUri getFromString(String representation) {
25+
BlockUri uri = new BlockUri(representation);
26+
if (!uri.isValid()) {
27+
logger.error("Failed to create valid BlockUri from string '{}'", representation);
28+
// StringRepresentationTypeHandler will turn this 'null' value into an empty Optional
29+
return null;
30+
}
31+
32+
return uri;
33+
}
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright 2022 The Terasology Foundation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package org.terasology.engine.persistence.typeHandling.extensionTypes;
5+
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.terasology.engine.core.SimpleUri;
9+
import org.terasology.persistence.typeHandling.StringRepresentationTypeHandler;
10+
11+
public class SimpleUriTypeHandler extends StringRepresentationTypeHandler<SimpleUri> {
12+
13+
private static final Logger logger = LoggerFactory.getLogger(SimpleUriTypeHandler.class);
14+
15+
@Override
16+
public String getAsString(SimpleUri uri) {
17+
if (uri == null) {
18+
return "";
19+
}
20+
return uri.toString();
21+
}
22+
23+
@Override
24+
public SimpleUri getFromString(String representation) {
25+
SimpleUri uri = new SimpleUri(representation);
26+
if (!uri.isValid()) {
27+
logger.error("Failed to create valid SimpleURI from string '{}'", representation);
28+
// StringRepresentationTypeHandler will turn this 'null' value into an empty Optional
29+
return null;
30+
}
31+
32+
return uri;
33+
}
34+
}

0 commit comments

Comments
 (0)