1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.databind.codegen;
28
29 import gov.nist.secauto.metaschema.core.model.IModule;
30 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
31
32 import java.io.IOException;
33 import java.nio.file.Path;
34 import java.util.Collection;
35 import java.util.Collections;
36 import java.util.HashMap;
37 import java.util.Map;
38 import java.util.stream.Stream;
39
40 import edu.umd.cs.findbugs.annotations.NonNull;
41
42 class ProductionImpl implements IProduction {
43
44 @NonNull
45 private final Map<IModule, IGeneratedModuleClass> moduleToProductionMap
46 = new HashMap<>();
47 @NonNull
48 private final Map<String, IPackageProduction> packageNameToProductionMap
49 = new HashMap<>();
50
51 public void addModule(
52 @NonNull IModule module,
53 @NonNull IMetaschemaClassFactory classFactory,
54 @NonNull Path targetDirectory) throws IOException {
55 for (IModule importedModule : module.getImportedModules()) {
56 assert importedModule != null;
57 addModule(importedModule, classFactory, targetDirectory);
58 }
59
60 if (moduleToProductionMap.get(module) == null) {
61 IGeneratedModuleClass metaschemaClass = classFactory.generateClass(module, targetDirectory);
62 moduleToProductionMap.put(module, metaschemaClass);
63 }
64 }
65
66 protected IPackageProduction addPackage(
67 @NonNull PackageMetadata metadata,
68 @NonNull IMetaschemaClassFactory classFactory,
69 @NonNull Path targetDirectory)
70 throws IOException {
71 String javaPackage = metadata.getPackageName();
72
73 IPackageProduction retval
74 = new PackageProductionImpl(
75 metadata,
76 classFactory,
77 targetDirectory);
78 packageNameToProductionMap.put(javaPackage, retval);
79 return retval;
80 }
81
82 @Override
83 @SuppressWarnings("null")
84 public Collection<IGeneratedModuleClass> getModuleProductions() {
85 return Collections.unmodifiableCollection(moduleToProductionMap.values());
86 }
87
88 @SuppressWarnings("null")
89 @NonNull
90 protected Collection<IPackageProduction> getPackageProductions() {
91 return Collections.unmodifiableCollection(packageNameToProductionMap.values());
92 }
93
94 @Override
95 public IGeneratedModuleClass getModuleProduction(IModule module) {
96 return moduleToProductionMap.get(module);
97 }
98
99 @Override
100 public Stream<IGeneratedDefinitionClass> getGlobalDefinitionClassesAsStream() {
101 return ObjectUtils.notNull(getModuleProductions().stream()
102 .flatMap(metaschema -> metaschema.getGeneratedDefinitionClasses().stream()));
103 }
104
105 @Override
106 public Stream<? extends IGeneratedClass> getGeneratedClasses() {
107 return ObjectUtils.notNull(Stream.concat(
108
109 getModuleProductions().stream()
110 .flatMap(module -> Stream.concat(
111 Stream.of(module),
112 module.getGeneratedDefinitionClasses().stream())),
113
114 getPackageProductions().stream()
115 .flatMap(javaPackage -> Stream.of(javaPackage.getGeneratedClass()))));
116 }
117
118 }