1
2
3
4
5
6 package dev.metaschema.schemagen;
7
8 import org.eclipse.jdt.annotation.Owning;
9
10 import java.io.Writer;
11 import java.util.LinkedList;
12 import java.util.List;
13 import java.util.function.BiConsumer;
14
15 import dev.metaschema.core.configuration.IConfiguration;
16 import dev.metaschema.core.model.IAssemblyDefinition;
17 import dev.metaschema.core.model.IDefinition;
18 import dev.metaschema.core.model.IModule;
19 import dev.metaschema.core.util.ObjectUtils;
20 import dev.metaschema.schemagen.datatype.IDatatypeManager;
21 import edu.umd.cs.findbugs.annotations.NonNull;
22 import edu.umd.cs.findbugs.annotations.Nullable;
23
24
25
26
27
28
29
30
31
32
33
34
35 public abstract class AbstractSchemaGenerator<
36 T extends AutoCloseable,
37 D extends IDatatypeManager,
38 S extends AbstractGenerationState<
39 T, D>>
40 implements ISchemaGenerator {
41
42
43
44
45
46
47
48
49
50
51
52
53 @NonNull
54 @Owning
55 protected abstract T newWriter(@NonNull Writer out);
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 @NonNull
71 protected abstract S newGenerationState(
72 @NonNull IModule module,
73 @NonNull T schemaWriter,
74 @NonNull IConfiguration<SchemaGenerationFeature<?>> configuration);
75
76
77
78
79
80
81
82 protected abstract void generateSchema(@NonNull S generationState);
83
84 @Override
85 public void generateFromModule(
86 IModule metaschema,
87 Writer out,
88 IConfiguration<SchemaGenerationFeature<?>> configuration) {
89 try {
90
91 @SuppressWarnings("resource")
92 T schemaWriter = newWriter(out);
93 S generationState = newGenerationState(metaschema, schemaWriter, configuration);
94 generateSchema(generationState);
95 generationState.flushWriter();
96 } catch (SchemaGenerationException ex) {
97 throw ex;
98 } catch (Exception ex) {
99 throw new SchemaGenerationException(ex);
100 }
101 }
102
103
104
105
106
107
108
109
110
111
112 protected List<IAssemblyDefinition> analyzeDefinitions(
113 @NonNull S generationState,
114 @Nullable BiConsumer<ModuleIndex.DefinitionEntry, IDefinition> handler) {
115
116
117 List<IAssemblyDefinition> rootAssemblyDefinitions = new LinkedList<>();
118 for (ModuleIndex.DefinitionEntry entry : generationState.getMetaschemaIndex().getDefinitions()) {
119
120 IDefinition definition = ObjectUtils.notNull(entry.getDefinition());
121 if (definition instanceof IAssemblyDefinition && ((IAssemblyDefinition) definition).isRoot()) {
122
123 IAssemblyDefinition assemblyDefinition = (IAssemblyDefinition) definition;
124 rootAssemblyDefinitions.add(assemblyDefinition);
125 }
126
127 boolean referenced = entry.isReferenced();
128 if (!referenced) {
129
130 continue;
131 }
132
133 if (handler != null) {
134 handler.accept(entry, definition);
135 }
136 }
137 return rootAssemblyDefinitions;
138 }
139
140 }