Skip to content

Commit 671c053

Browse files
committed
#24 Makes the type resolver asynchronous
1 parent 69bb975 commit 671c053

File tree

3 files changed

+49
-21
lines changed

3 files changed

+49
-21
lines changed

src/main/java/io/vlingo/schemata/codegen/processor/types/CacheTypeResolver.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88
package io.vlingo.schemata.codegen.processor.types;
99

10+
import io.vlingo.common.Completes;
11+
import io.vlingo.schemata.codegen.ast.types.TypeDefinition;
12+
1013
import java.util.HashMap;
1114
import java.util.Map;
1215
import java.util.Optional;
1316

14-
import io.vlingo.schemata.codegen.ast.types.TypeDefinition;
15-
1617
public class CacheTypeResolver implements TypeResolver {
1718
private final Map<String, TypeDefinition> types;
1819

@@ -21,13 +22,13 @@ public CacheTypeResolver() {
2122
}
2223

2324
@Override
24-
public Optional<TypeDefinition> resolve(String fullQualifiedTypeName, final String simpleTypeName) {
25+
public Completes<Optional<TypeDefinition>> resolve(String fullQualifiedTypeName, final String simpleTypeName) {
2526
for (final TypeDefinition type : types.values()) {
2627
if (type.fullyQualifiedTypeName.equals(fullQualifiedTypeName) || type.typeName.equals(simpleTypeName)) {
27-
return Optional.of(type);
28+
return Completes.withSuccess(Optional.of(type));
2829
}
2930
}
30-
return Optional.empty();
31+
return Completes.withSuccess(Optional.empty());
3132
}
3233

3334
public void produce(TypeDefinition typeDefinition, String version) {

src/main/java/io/vlingo/schemata/codegen/processor/types/TypeResolver.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77

88
package io.vlingo.schemata.codegen.processor.types;
99

10-
import java.util.Optional;
11-
10+
import io.vlingo.common.Completes;
1211
import io.vlingo.schemata.codegen.ast.types.TypeDefinition;
1312

13+
import java.util.Optional;
14+
1415
public interface TypeResolver {
15-
Optional<TypeDefinition> resolve(final String fullQualifiedTypeName, final String simpleTypeName);
16+
Completes<Optional<TypeDefinition>> resolve(final String fullQualifiedTypeName, final String simpleTypeName);
1617
}

src/main/java/io/vlingo/schemata/codegen/processor/types/TypeResolverProcessor.java

+39-13
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@
77

88
package io.vlingo.schemata.codegen.processor.types;
99

10-
import java.util.List;
11-
import java.util.stream.Collectors;
12-
1310
import io.vlingo.actors.Actor;
1411
import io.vlingo.common.Completes;
1512
import io.vlingo.schemata.Schemata;
@@ -20,6 +17,11 @@
2017
import io.vlingo.schemata.codegen.ast.types.TypeDefinition;
2118
import io.vlingo.schemata.codegen.processor.Processor;
2219

20+
import java.util.ArrayList;
21+
import java.util.List;
22+
import java.util.concurrent.CountDownLatch;
23+
import java.util.stream.Collectors;
24+
2325
public class TypeResolverProcessor extends Actor implements Processor {
2426
private final TypeResolver resolver;
2527

@@ -28,35 +30,41 @@ public TypeResolverProcessor(TypeResolver resolver) {
2830
}
2931

3032
@Override
33+
@SuppressWarnings("unchecked")
3134
public Completes<Node> process(Node node, final String fullyQualifiedTypeName) {
3235
TypeDefinition type = Processor.requireBeing(node, TypeDefinition.class);
3336

34-
List<Node> processedTypes = type.children.stream()
37+
List<Completes<Node>> processedTypeList = type.children.stream()
3538
.map(e -> (FieldDefinition) e)
3639
.map(this::resolveType)
40+
.map(e -> (Completes) e)
41+
.map(e -> (Completes<Node>) e)
3742
.collect(Collectors.toList());
3843

39-
completesEventually().with(new TypeDefinition(type.category, fullyQualifiedTypeName, type.typeName, processedTypes));
44+
Completes<List<Node>> eventuallyProcessedTypes = unwrap(processedTypeList);
45+
eventuallyProcessedTypes.andFinallyConsume(processedTypes -> {
46+
completesEventually().with(new TypeDefinition(type.category, fullyQualifiedTypeName, type.typeName, processedTypes));
47+
});
48+
4049
return completes();
4150

4251
}
4352

44-
private FieldDefinition resolveType(FieldDefinition fieldDefinition) {
53+
private Completes<FieldDefinition> resolveType(FieldDefinition fieldDefinition) {
4554
final Type typeNode = fieldDefinition.type;
4655

4756
if (typeNode instanceof BasicType) {
4857
final BasicType basicType = (BasicType) typeNode;
4958

50-
final Type type =
51-
resolver
52-
.resolve(basicType.typeName, simple(basicType.typeName))
53-
.map(definition -> (Type) definition)
54-
.orElse(basicType);
59+
Completes<Type> resolvedType = resolver.resolve(basicType.typeName, simple(basicType.typeName))
60+
.andThen(foundType -> foundType.map(definition -> (Type) definition).orElse(basicType));
5561

56-
return new FieldDefinition(type, fieldDefinition.version, fieldDefinition.name, fieldDefinition.defaultValue);
62+
return resolvedType.andThen(type ->
63+
new FieldDefinition(type, fieldDefinition.version, fieldDefinition.name, fieldDefinition.defaultValue)
64+
);
5765
}
5866

59-
return fieldDefinition;
67+
return Completes.withSuccess(fieldDefinition);
6068
}
6169

6270
private String simple(final String typeName) {
@@ -66,4 +74,22 @@ private String simple(final String typeName) {
6674
}
6775
return typeName;
6876
}
77+
78+
private <T> Completes<List<T>> unwrap(List<Completes<T>> completes) {
79+
CountDownLatch latch = new CountDownLatch(completes.size());
80+
List<T> result = new ArrayList<>(completes.size());
81+
completes.forEach(complete -> {
82+
complete.andThenConsume(result::add)
83+
.andFinallyConsume(e -> latch.countDown());
84+
});
85+
86+
return Completes.withSuccess(result)
87+
.andThenConsume(i -> {
88+
try {
89+
latch.await();
90+
} catch (InterruptedException e) {
91+
logger().error("TypeResolverProcessor could not unwrap list of Completes<T> " + e.getMessage(), e);
92+
}
93+
});
94+
}
6995
}

0 commit comments

Comments
 (0)