1
2
3
4
5
6 package dev.metaschema.databind.codegen;
7
8 import java.io.IOException;
9 import java.nio.file.Path;
10 import java.util.Collection;
11 import java.util.HashMap;
12 import java.util.Map;
13 import java.util.stream.Stream;
14
15 import dev.metaschema.core.model.IModule;
16 import dev.metaschema.databind.codegen.config.IBindingConfiguration;
17 import dev.metaschema.databind.codegen.typeinfo.IMetaschemaClassFactory;
18 import dev.metaschema.databind.codegen.typeinfo.ITypeResolver;
19 import edu.umd.cs.findbugs.annotations.NonNull;
20 import edu.umd.cs.findbugs.annotations.Nullable;
21
22
23
24
25 public interface IProduction {
26
27
28
29
30
31
32
33 @NonNull
34 Collection<IGeneratedModuleClass> getModuleProductions();
35
36
37
38
39
40
41
42
43
44
45 @Nullable
46 IGeneratedModuleClass getModuleProduction(@NonNull IModule module);
47
48
49
50
51
52
53
54
55
56
57 @NonNull
58 Collection<IGeneratedDefinitionClass> getGlobalDefinitionClasses();
59
60
61
62
63
64
65
66 @NonNull
67 Stream<? extends IGeneratedClass> getGeneratedClasses();
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 @NonNull
84 static IProduction of(
85 @NonNull Collection<? extends IModule> modules,
86 @NonNull IBindingConfiguration bindingConfiguration,
87 @NonNull Path classDir) throws IOException {
88
89 ITypeResolver typeResolver = ITypeResolver.newTypeResolver(bindingConfiguration);
90
91 IMetaschemaClassFactory classFactory = IMetaschemaClassFactory.newInstance(typeResolver);
92
93 ProductionImpl retval = new ProductionImpl();
94 for (IModule module : modules) {
95 assert module != null;
96 retval.addModule(module, classFactory, classDir);
97 }
98
99 Map<String, PackageMetadata> packageNameToPackageMetadataMap = new HashMap<>();
100 for (IGeneratedModuleClass moduleProduction : retval.getModuleProductions()) {
101 String packageName = moduleProduction.getPackageName();
102
103 PackageMetadata metadata = packageNameToPackageMetadataMap.get(packageName);
104 if (metadata == null) {
105 metadata = new PackageMetadata(moduleProduction);
106 packageNameToPackageMetadataMap.put(metadata.getPackageName(), metadata);
107 } else {
108 metadata.addModule(moduleProduction);
109 }
110 }
111
112 for (PackageMetadata metadata : packageNameToPackageMetadataMap.values()) {
113 assert metadata != null;
114 retval.addPackage(
115 metadata,
116 classFactory,
117 classDir);
118 }
119 return retval;
120 }
121 }