Skip to content

Commit 19d755b

Browse files
authored
Fixed handling of malformed resource spec (#27)
* Fixed handling of malformed resource spec Added logging to emit certain failures and basic generation flow. No longer hard failing on malformed specification files.
1 parent 621338f commit 19d755b

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
</properties>
1919

2020
<dependencies>
21+
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
22+
<dependency>
23+
<groupId>org.apache.logging.log4j</groupId>
24+
<artifactId>log4j-core</artifactId>
25+
<version>2.11.2</version>
26+
</dependency>
27+
2128
<dependency>
2229
<groupId>junit</groupId>
2330
<artifactId>junit</artifactId>

src/main/java/aws/cfn/codegen/json/Codegen.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import com.fasterxml.jackson.databind.node.ObjectNode;
1111
import com.github.mustachejava.DefaultMustacheFactory;
1212
import com.github.mustachejava.Mustache;
13+
import org.apache.logging.log4j.Logger;
14+
import org.apache.logging.log4j.LogManager;
1315

1416
import java.io.File;
1517
import java.io.FileOutputStream;
@@ -32,6 +34,8 @@
3234

3335
public final class Codegen {
3436

37+
private static Logger logger = LogManager.getLogger(Codegen.class);
38+
3539
private final ObjectMapper mapper;
3640
private final ObjectNode definitions;
3741
private final Config config;
@@ -189,6 +193,7 @@ public void generate() throws Exception {
189193
config.getSettings().getRegions().stream()
190194
.map(region -> {
191195
try {
196+
logger.debug("Loading specification for {}", region);
192197
return new Object[] {
193198
region,
194199
loadSpecification(region),
@@ -197,17 +202,21 @@ public void generate() throws Exception {
197202
};
198203
}
199204
catch (Exception e) {
205+
logger.fatal(String.format("Loading specification for %s failed", region), e);
200206
throw new RuntimeException(e);
201207
}
202208
})
203209
.forEach(result -> {
210+
String region = (String)result[0];
211+
logger.debug("Starting generation for {} specification", region);
204212
CfnSpecification spec = (CfnSpecification) result[1];
205213
Map<String, File> locations = (Map<String, File>) result[2];
206214
Map<String, ObjectNode> defns = (Map<String, ObjectNode>) result[3];
207215
try {
208216
generate(spec, locations, defns);
209217
}
210218
catch (Exception e) {
219+
logger.fatal(String.format("Generation for %s specification failed", region), e);
211220
throw new RuntimeException(e);
212221
}
213222
});
@@ -227,12 +236,26 @@ private void generate(CfnSpecification specification,
227236

228237
Map<List<String>, ObjectNode> definitions = new LinkedHashMap<>(sorted.size());
229238
for (final String name: sorted) {
230-
ResourceType type = resources.get(name);
231-
String defnName = name.replace("::", "_");
232-
resDefns.add(defnName);
233-
ObjectNode typeDefn = mapper.createObjectNode();
234-
handleType(typeDefn, defnName, name, type, true, propertyNames);
235-
definitions.put(Arrays.asList(name, defnName), typeDefn);
239+
ResourceType type = null;
240+
try {
241+
type = resources.get(name);
242+
String defnName = name.replace("::", "_");
243+
resDefns.add(defnName);
244+
ObjectNode typeDefn = mapper.createObjectNode();
245+
handleType(typeDefn, defnName, name, type, true, propertyNames);
246+
definitions.put(Arrays.asList(name, defnName), typeDefn);
247+
logger.debug("Processed type {}", name);
248+
}
249+
catch (Exception e)
250+
{
251+
// ignore and emit warning for malformed types in the spec
252+
if (type != null) {
253+
logger.error("An error occurred processing type {}", name);
254+
}
255+
else {
256+
throw e;
257+
}
258+
}
236259
}
237260
addToPerGroupRoots(definitions, groupSpecDefinitions);
238261

0 commit comments

Comments
 (0)