Skip to content

Commit ef7c613

Browse files
authored
chore: adding a resolver transformer (#43)
Adding the default implementation for the `ResolverTransformer` to set the value of a scalar based on a path lookup in the base resource item. fixes: #32
1 parent 7529438 commit ef7c613

File tree

8 files changed

+119
-1
lines changed

8 files changed

+119
-1
lines changed

lib/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ dependencies {
3838
testImplementation(platform('org.junit:junit-bom:5.10.0'))
3939
testImplementation('org.junit.jupiter:junit-jupiter:5.10.0')
4040
testImplementation('org.junit.jupiter:junit-jupiter-api:5.10.0')
41+
testImplementation('org.mockito:mockito-core:5.4.0')
42+
testImplementation('org.mockito:mockito-junit-jupiter:5.4.0')
4143
testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.10.0')
4244

4345
testImplementation 'org.assertj:assertj-core:3.24.2'
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package io.cloudquery.schema;
2+
3+
public class ClientMeta {
4+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.cloudquery.schema;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
@Builder
7+
@Getter
8+
public class Column {
9+
private String name;
10+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.cloudquery.schema;
2+
3+
import io.cloudquery.transformers.TransformerException;
4+
5+
public interface ColumnResolver {
6+
void resolve(ClientMeta meta, Resource resource, Column column) throws TransformerException;
7+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.cloudquery.schema;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
@Builder
7+
@Getter
8+
public class Resource {
9+
private Object item;
10+
11+
12+
public void set(String columnName, Object value) {
13+
}
14+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.cloudquery.transformers;
2+
3+
import io.cloudquery.helper.ReflectionPathResolver;
4+
import io.cloudquery.helper.ReflectionPathResolver.PathResolverException;
5+
import io.cloudquery.schema.ColumnResolver;
6+
7+
import java.lang.reflect.Field;
8+
9+
public interface ResolverTransformer {
10+
class DefaulResolverTransformer implements ResolverTransformer {
11+
@Override
12+
public ColumnResolver transform(Field field, String path) throws TransformerException {
13+
return (meta, resource, column) -> {
14+
try {
15+
resource.set(column.getName(), ReflectionPathResolver.resolve(resource.getItem(), path));
16+
} catch (PathResolverException ex) {
17+
throw new TransformerException("Failed to resolve path: " + path, ex);
18+
}
19+
};
20+
}
21+
}
22+
23+
ColumnResolver transform(Field field, String path) throws TransformerException;
24+
}
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package io.cloudquery.transformers;
22

3-
public class TransformerException extends Exception{
3+
public class TransformerException extends Exception {
44
public TransformerException(String message) {
55
super(message);
66
}
7+
8+
public TransformerException(String message, Throwable ex) {
9+
super(message, ex);
10+
}
711
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.cloudquery.transformers;
2+
3+
import io.cloudquery.schema.Column;
4+
import io.cloudquery.schema.Resource;
5+
import io.cloudquery.transformers.ResolverTransformer.DefaulResolverTransformer;
6+
import lombok.Builder;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Test;
9+
import org.junit.jupiter.api.extension.ExtendWith;
10+
import org.mockito.Mock;
11+
import org.mockito.junit.jupiter.MockitoExtension;
12+
13+
import static org.junit.Assert.assertThrows;
14+
import static org.mockito.ArgumentMatchers.eq;
15+
import static org.mockito.Mockito.verify;
16+
import static org.mockito.Mockito.when;
17+
18+
@ExtendWith(MockitoExtension.class)
19+
class DefaultResolverTransformerTest {
20+
21+
@Builder
22+
public static class ResourceItem {
23+
public String myCustomID;
24+
}
25+
26+
private DefaulResolverTransformer transformer;
27+
28+
@Mock
29+
private Resource resource;
30+
31+
@BeforeEach
32+
void setUp() {
33+
transformer = new DefaulResolverTransformer();
34+
35+
when(resource.getItem()).thenReturn(ResourceItem.builder().myCustomID("1234").build());
36+
}
37+
38+
@Test
39+
public void shouldTransformCustomFieldNamesFromResource() throws TransformerException {
40+
Column targetColumn = Column.builder().name("id").build();
41+
42+
transformer.transform(null, "myCustomID").resolve(null, resource, targetColumn);
43+
44+
verify(resource).set(eq("id"), eq("1234"));
45+
}
46+
47+
@Test
48+
public void shouldThrowExceptionIfResourceFieldNameNotFound() throws TransformerException {
49+
Column targetColumn = Column.builder().name("id").build();
50+
51+
assertThrows(TransformerException.class, () -> transformer.transform(null, "badFieldName").resolve(null, resource, targetColumn));
52+
}
53+
}

0 commit comments

Comments
 (0)