forked from aws/aws-sdk-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCodeGenerator.java
More file actions
131 lines (112 loc) · 4.76 KB
/
CodeGenerator.java
File metadata and controls
131 lines (112 loc) · 4.76 KB
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
* Copyright (c) 2016. Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.amazonaws.codegen;
import com.amazonaws.codegen.emitters.CodeEmitter;
import com.amazonaws.codegen.emitters.GeneratorTask;
import com.amazonaws.codegen.emitters.GeneratorTaskExecutor;
import com.amazonaws.codegen.emitters.GeneratorTaskParams;
import com.amazonaws.codegen.emitters.tasks.ApiGatewayGeneratorTasks;
import com.amazonaws.codegen.emitters.tasks.AwsGeneratorTasks;
import com.amazonaws.codegen.internal.Jackson;
import com.amazonaws.codegen.internal.Utils;
import com.amazonaws.codegen.model.intermediate.IntermediateModel;
import com.amazonaws.codegen.model.intermediate.Protocol;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
public class CodeGenerator {
private static final String MODEL_DIR_NAME = "models";
private final C2jModels models;
private final String outputDirectory;
private final String codeGenBinDirectory;
/**
* The prefix for the file name that contains the intermediate model.
*/
private final String fileNamePrefix;
public CodeGenerator(C2jModels models,
String outputDirectory,
String codeGenBinDirectory,
String fileNamePrefix) {
this.models = models;
this.outputDirectory = outputDirectory;
this.codeGenBinDirectory = codeGenBinDirectory;
this.fileNamePrefix = fileNamePrefix;
}
/**
* load ServiceModel. load code gen configuration from individual client. load Waiters. generate intermediate model. generate
* code.
*/
public void execute() {
try {
final IntermediateModel intermediateModel =
new IntermediateModelBuilder(models, codeGenBinDirectory).build();
// Dump the intermediate model to a file
writeIntermediateModel(intermediateModel);
emitCode(intermediateModel);
} catch (Exception e) {
throw new RuntimeException(
"Failed to generate code. Exception message : "
+ e.getMessage(), e);
}
}
private void writeIntermediateModel(IntermediateModel model)
throws IOException {
final File modelDir = getModelDirectory(outputDirectory);
PrintWriter writer = null;
try {
File outDir = new File(outputDirectory);
if (!outDir.exists()) {
if (!outDir.mkdirs()) {
throw new RuntimeException("Failed to create "
+ outDir.getAbsolutePath());
}
}
File outputFile = new File(modelDir, fileNamePrefix + "-intermediate.json");
if (!outputFile.exists()) {
if (!outputFile.createNewFile()) {
throw new RuntimeException("Error creating file "
+ outputFile.getAbsolutePath());
}
}
writer = new PrintWriter(outputFile, "UTF-8");
Jackson.write(model, writer);
} finally {
if (writer != null) {
writer.flush();
writer.close();
}
}
}
private void emitCode(IntermediateModel intermediateModel) throws Exception {
final Iterable<GeneratorTask> generatorTasks = createGeneratorTasks(intermediateModel);
try (CodeEmitter emitter = new CodeEmitter(generatorTasks, new GeneratorTaskExecutor())) {
emitter.emit();
}
}
private Iterable<GeneratorTask> createGeneratorTasks(IntermediateModel intermediateModel) {
// For clients built internally, the output directory and source directory are the same.
GeneratorTaskParams params = GeneratorTaskParams.create(intermediateModel, outputDirectory, outputDirectory);
if (params.getModel().getMetadata().getProtocol() == Protocol.API_GATEWAY) {
return new ApiGatewayGeneratorTasks(params);
} else {
return new AwsGeneratorTasks(params);
}
}
public static File getModelDirectory(String outputDirectory) {
File dir = new File(outputDirectory, MODEL_DIR_NAME);
Utils.createDirectory(dir);
return dir;
}
}