Skip to content

Commit 4b5f84b

Browse files
fix(DatastoreApi): Fixed ExtensionHandler and added Definition Visitor
1 parent bc569bf commit 4b5f84b

File tree

9 files changed

+142
-79
lines changed

9 files changed

+142
-79
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ License.
2828
<artifactId>odm-specification-dpdescriptor-parser</artifactId>
2929
<name>ODM Specification Data Product Descriptor Parser</name>
3030
<description>Specification Parser for Data Product Descriptor of Open Data Mesh</description>
31-
<version>2.2.0</version>
31+
<version>2.2.1</version>
3232

3333
<distributionManagement>
3434
<repository>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.opendatamesh.dpds.datastoreapi.v1.extensions;
2+
3+
import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiExternalResourceObject;
4+
import org.opendatamesh.dpds.datastoreapi.v1.visitor.DataStoreApiStandardDefinitionObjectVisitor;
5+
import org.opendatamesh.dpds.model.core.ComponentBase;
6+
7+
public abstract class DataStoreApiStandardDefinitionVisitor<T extends ComponentBase> implements DataStoreApiStandardDefinitionObjectVisitor {
8+
9+
private final Class<T> clazz;
10+
11+
protected DataStoreApiStandardDefinitionVisitor(Class<T> clazz) {
12+
this.clazz = clazz;
13+
}
14+
15+
public final void visit(ComponentBase definition) {
16+
if (clazz.isInstance(definition)) {
17+
visitDefinition(clazz.cast(definition));
18+
}
19+
}
20+
21+
@Override
22+
public void visit(DataStoreApiExternalResourceObject externalResourceObject) {
23+
//DO NOTHING
24+
}
25+
26+
protected abstract void visitDefinition(T definition);
27+
}

src/main/java/org/opendatamesh/dpds/datastoreapi/v1/extensions/visitorimpl/ExtensionHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public void handleStandardObjectDefinition(DataStoreApiStandardDefinitionObject
8888
JsonNode rawDefinition;
8989
switch (status) {
9090
case SERIALIZING:
91-
rawDefinition = supportedStandardDefinitionConverter.get().serialize(mapper, standardDefinitionObject);
91+
rawDefinition = supportedStandardDefinitionConverter.get().serialize(mapper, standardDefinitionObject.getDefinition());
9292
standardDefinitionObject.setDefinition(mapper.treeToValue(rawDefinition, ComponentBase.class));
9393
break;
9494
case DESERIALIZING:
Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,30 @@
11
package org.opendatamesh.dpds.datastoreapi.v1;
22

3+
import org.opendatamesh.dpds.datastoreapi.v1.extensions.DataStoreApiStandardDefinitionVisitor;
34
import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApi;
5+
import org.opendatamesh.dpds.datastoreapi.v1.model.DataStoreApiStandardDefinitionObject;
6+
import org.opendatamesh.dpds.extensions.DefinitionVisitor;
47

5-
public class DataStoreApiDefinitionVisitorImpl extends DataStoreApiDefinitionVisitor {
8+
import java.util.concurrent.atomic.AtomicInteger;
69

7-
public DataStoreApiDefinitionVisitorImpl() {
8-
//DO NOTHING
10+
class DataStoreApiDefinitionVisitorImpl extends DefinitionVisitor<DataStoreApi> {
11+
12+
private final AtomicInteger counter;
13+
14+
DataStoreApiDefinitionVisitorImpl(AtomicInteger counter) {
15+
super(DataStoreApi.class);
16+
this.counter = counter;
917
}
1018

1119
@Override
1220
protected void visitDefinition(DataStoreApi definition) {
13-
throw new RuntimeException("OK");
21+
if (definition.getSchema() != null && definition.getSchema().getTables() != null) {
22+
DataStoreApiStandardDefinitionVisitor<?> visitor = new DumbDataStoreApiStandardDefinitionObjectVisitor(counter);
23+
definition.getSchema()
24+
.getTables()
25+
.stream()
26+
.map(DataStoreApiStandardDefinitionObject::getDefinition)
27+
.forEach(visitor::visit);
28+
}
1429
}
1530
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.opendatamesh.dpds.datastoreapi.v1;
2+
3+
import org.opendatamesh.dpds.model.core.ComponentBase;
4+
5+
class DumbDataStoreApiStandardDefinitionObject extends ComponentBase {
6+
private String specField;
7+
8+
DumbDataStoreApiStandardDefinitionObject() {
9+
}
10+
11+
public String getSpecField() {
12+
return specField;
13+
}
14+
15+
public void setSpecField(String specField) {
16+
this.specField = specField;
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.opendatamesh.dpds.datastoreapi.v1;
2+
3+
import com.fasterxml.jackson.core.JacksonException;
4+
import com.fasterxml.jackson.databind.JsonNode;
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import org.opendatamesh.dpds.datastoreapi.v1.extensions.DataStoreApiStandardDefinitionConverter;
7+
8+
class DumbDataStoreApiStandardDefinitionObjectConverter implements DataStoreApiStandardDefinitionConverter<DumbDataStoreApiStandardDefinitionObject> {
9+
10+
private static final String SPECIFICATION = "dumb_specification";
11+
private static final String VERSION = "^1(\\.\\d+){0,2}$";
12+
13+
DumbDataStoreApiStandardDefinitionObjectConverter() {
14+
}
15+
16+
@Override
17+
public boolean supports(String specification, String specificationVersion) {
18+
return SPECIFICATION.equalsIgnoreCase(specification) && specificationVersion.matches(VERSION);
19+
}
20+
21+
@Override
22+
public DumbDataStoreApiStandardDefinitionObject deserialize(ObjectMapper defaultMapper, JsonNode jsonNode) throws JacksonException {
23+
return defaultMapper.treeToValue(jsonNode, DumbDataStoreApiStandardDefinitionObject.class);
24+
}
25+
26+
@Override
27+
public JsonNode serialize(ObjectMapper defaultMapper, DumbDataStoreApiStandardDefinitionObject value) throws JacksonException {
28+
return defaultMapper.valueToTree(value);
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.opendatamesh.dpds.datastoreapi.v1;
2+
3+
import org.opendatamesh.dpds.datastoreapi.v1.extensions.DataStoreApiStandardDefinitionVisitor;
4+
5+
import java.util.concurrent.atomic.AtomicInteger;
6+
7+
class DumbDataStoreApiStandardDefinitionObjectVisitor extends DataStoreApiStandardDefinitionVisitor<DumbDataStoreApiStandardDefinitionObject> {
8+
9+
private final AtomicInteger counter;
10+
11+
DumbDataStoreApiStandardDefinitionObjectVisitor(AtomicInteger counter) {
12+
super(DumbDataStoreApiStandardDefinitionObject.class);
13+
this.counter = counter;
14+
}
15+
16+
@Override
17+
protected void visitDefinition(DumbDataStoreApiStandardDefinitionObject definition) {
18+
this.counter.incrementAndGet();
19+
}
20+
}

src/test/java/org/opendatamesh/dpds/datastoreapi/v1/TestDataStoreApi.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
import org.opendatamesh.dpds.parser.ParserFactory;
1515

1616
import java.io.IOException;
17+
import java.util.concurrent.atomic.AtomicInteger;
1718

1819
import static org.assertj.core.api.Assertions.assertThat;
19-
import static org.junit.jupiter.api.Assertions.assertThrows;
2020

2121
public class TestDataStoreApi {
2222
@Test
@@ -53,7 +53,9 @@ public void testSimpleDataStoreApi() throws IOException {
5353
public void testSimpleDataStoreApiVisitor() throws IOException {
5454
JsonNode initialJson = new ObjectMapper().readTree(this.getClass().getResource("data_product_descriptor_simple_data_store_api.json"));
5555

56-
DataStoreApiParser dataStoreApiParser = DataStoreApiParserFactory.getParser();
56+
DataStoreApiParser dataStoreApiParser = DataStoreApiParserFactory
57+
.getParser()
58+
.register(new DumbDataStoreApiStandardDefinitionObjectConverter());
5759
DefinitionConverter<DataStoreApi> dataStoreApiConverter = new DataStoreApiDefinitionConverter(dataStoreApiParser);
5860

5961
Parser dataProductParser = ParserFactory.getParser()
@@ -67,14 +69,13 @@ public void testSimpleDataStoreApiVisitor() throws IOException {
6769
.ignoringCollectionOrder()
6870
.isEqualTo(initialJson);
6971

70-
DefinitionVisitor<DataStoreApi> definitionVisitor = new DataStoreApiDefinitionVisitorImpl();
72+
AtomicInteger counter = new AtomicInteger(0);
73+
DefinitionVisitor<DataStoreApi> definitionVisitor = new DataStoreApiDefinitionVisitorImpl(counter);
7174

72-
RuntimeException exception = assertThrows(RuntimeException.class, () ->
73-
dataProductVersion.getInterfaceComponents()
74-
.getOutputPorts()
75-
.forEach(port -> definitionVisitor.visit(port.getPromises().getApi().getDefinition()))
76-
);
75+
dataProductVersion.getInterfaceComponents()
76+
.getOutputPorts()
77+
.forEach(port -> definitionVisitor.visit(port.getPromises().getApi().getDefinition()));
7778

78-
assertThat(exception.getMessage()).isEqualTo("OK");
79+
assertThat(counter.get()).isEqualTo(1);
7980
}
8081
}

src/test/resources/org/opendatamesh/dpds/datastoreapi/v1/data_product_descriptor_simple_data_store_api.json

Lines changed: 16 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -51,75 +51,27 @@
5151
}
5252
},
5353
"schema": {
54-
"databaseName": "film_rental_sales",
55-
"databaseSchemaName": "profit",
54+
"databaseName": "database name",
55+
"databaseSchemaName": "database schema",
5656
"tables": [
5757
{
58-
"name": "v_monthly_customer_payments",
58+
"name": "standardObject1",
5959
"version": "1.0.0",
60-
"description": "The view that store the information about monthly customer payments",
61-
"specification": "json-schema",
60+
"description": "Description",
61+
"specification": "dumb_specification",
6262
"specificationVersion": "1",
6363
"definition": {
64-
"name": "v_monthly_customer_payments",
65-
"version": "1.0.3",
66-
"fullyQualifiedName": "urn:dpds:qualityDemo:dataproducts:test1:1:1.0.3:outputPorts:outputPortName:tables:film_rental_sales.profit.v_monthly_customer_payments",
67-
"displayName": "Monthly Customer Payments",
68-
"description": "The view that store the information about monthly customer payments",
69-
"physicalType": "VIEW",
70-
"type": "object",
71-
"properties": {
72-
"customer_id": {
73-
"type": "string",
74-
"name": "customer_id",
75-
"kind": "ATTRIBUTE",
76-
"required": true,
77-
"displayName": "Customer ID",
78-
"isUnique": true,
79-
"isNullable": true,
80-
"length": 10,
81-
"physicalType": "VARCHAR",
82-
"ordinalPosition": 1
83-
},
84-
"customer_email": {
85-
"type": "string",
86-
"name": "customer_email",
87-
"description": "Email address of the customer",
88-
"kind": "ATTRIBUTE",
89-
"required": true,
90-
"displayName": "Customer Email",
91-
"isUnique": false,
92-
"isNullable": true,
93-
"length": 255,
94-
"physicalType": "VARCHAR",
95-
"ordinalPosition": 2
96-
},
97-
"payment_month": {
98-
"type": "string",
99-
"format": "date-time",
100-
"name": "payment_month",
101-
"description": "Month of the payment",
102-
"kind": "ATTRIBUTE",
103-
"required": true,
104-
"displayName": "Payment Month",
105-
"isUnique": false,
106-
"isNullable": false,
107-
"physicalType": "TIMESTAMP",
108-
"ordinalPosition": 3
109-
},
110-
"total_payment": {
111-
"type": "number",
112-
"name": "total_payment",
113-
"description": "Total payment amount for the month",
114-
"kind": "ATTRIBUTE",
115-
"required": true,
116-
"displayName": "Total Payment",
117-
"isUnique": false,
118-
"isNullable": false,
119-
"physicalType": "NUMERIC",
120-
"ordinalPosition": 4
121-
}
122-
}
64+
"specField": "specValue"
65+
}
66+
},
67+
{
68+
"name": "standardObject2",
69+
"version": "1.0.0",
70+
"description": "Description",
71+
"specification": "another_dumb_specification",
72+
"specificationVersion": "1",
73+
"definition": {
74+
"specField": "specValue"
12375
}
12476
}
12577
]

0 commit comments

Comments
 (0)