1
+ import java .io .BufferedReader ;
2
+ import java .io .File ;
3
+ import java .io .FileInputStream ;
4
+ import java .io .FileOutputStream ;
5
+ import java .io .FileReader ;
6
+ import java .io .IOException ;
7
+ import java .io .InputStreamReader ;
8
+ import java .io .PrintWriter ;
9
+ import java .util .ArrayList ;
10
+ import java .util .Arrays ;
11
+ import java .util .HashMap ;
12
+ import java .util .LinkedHashMap ;
13
+ import java .util .List ;
14
+ import java .util .Map ;
15
+ import java .util .stream .Collectors ;
16
+
17
+ import javafx .util .Pair ;
18
+ import jdk .nashorn .internal .runtime .regexp .joni .Regex ;
19
+
20
+ public class Generator {
21
+ private static final char CSV_LIST_SEPARATOR = '|' ;
22
+ private static final String ENUM_CLASS_NAME = "ErrorEnum" ;
23
+ private static final String FILE_SUFFIX_NAME = "java" ;
24
+ private String inputFile ;
25
+ private String outputDir ;
26
+ private List <String > attributeList ;
27
+
28
+ public Generator (String inputFile , String outputDir ) {
29
+ this .inputFile = inputFile ;
30
+ this .outputDir = outputDir ;
31
+ }
32
+
33
+ public void generate () {
34
+ Map <String , Map <String , String >> dataMap = obtainDataMap ();
35
+ generateConstantFile (dataMap );
36
+ generateEnumFile (dataMap );
37
+ }
38
+
39
+ private void generateConstantFile (Map <String , Map <String , String >> dataMap ) {
40
+ for (String attribute : attributeList ) {
41
+ String className = toBigHump (attribute );
42
+ String filePath = obtainOutputFilePath (className );
43
+ String content = obtainConstantTemplate (className , attribute , dataMap );
44
+ generateFile (filePath , content );
45
+ }
46
+ }
47
+
48
+ private void generateEnumFile (Map <String , Map <String , String >> dataMap ) {
49
+ String className = ENUM_CLASS_NAME ;
50
+ String filePath = obtainOutputFilePath (className );
51
+ String content = obtainEnumTemplate (className , dataMap );
52
+ generateFile (filePath , content );
53
+ }
54
+
55
+ private Map <String , Map <String , String >> obtainDataMap () {
56
+ List <List <String >> dataList = new ArrayList <>();
57
+ List <String > rowList = parseFile (inputFile );
58
+ for (String row : rowList ) {
59
+ dataList .add (splitRowData (row ));
60
+ }
61
+ attributeList = dataList .remove (0 );
62
+
63
+ Map <String , Map <String , String >> dataMap = new LinkedHashMap <>();
64
+ int attributeSize = attributeList .size ();
65
+ for (List <String > rowDataList : dataList ) {
66
+ fillList (rowDataList , attributeSize );
67
+ String name = obtainLabelName (rowDataList .get (0 ));
68
+ Map <String , String > itemMap = new LinkedHashMap <>();
69
+ dataMap .put (name , itemMap );
70
+
71
+ for (int index = 0 ; index < attributeSize ; index ++) {
72
+ String attribute = attributeList .get (index );
73
+ String data = rowDataList .get (index );
74
+ itemMap .put (attribute , data );
75
+ }
76
+ }
77
+
78
+ return dataMap ;
79
+ }
80
+
81
+ private List <String > splitRowData (String row ) {
82
+ List <String > list = new ArrayList <>();
83
+ String regex = String .format ("\\ %s" , CSV_LIST_SEPARATOR );
84
+ String [] rowArr = row .split (regex );
85
+ for (String data : rowArr ) {
86
+ list .add (data .trim ());
87
+ }
88
+ return list ;
89
+ }
90
+
91
+ private List <String > fillList (List <String > list , int size ) {
92
+ if (list .size () < size ) {
93
+ for (int index = 0 ; index < size - list .size (); index ++) {
94
+ list .add ("" );
95
+ }
96
+ }
97
+ return list ;
98
+ }
99
+
100
+ private String obtainLabelName (String name ) {
101
+ String regex = "\\ s+" ;
102
+ return name .trim ().replaceAll (regex , "_" ).toUpperCase ();
103
+ }
104
+
105
+ private String obtainPropertyName (String property ) {
106
+ return toSmallHump (property );
107
+ }
108
+
109
+ private String toBigHump (String str ) {
110
+ return toHump (str , false );
111
+ }
112
+
113
+ private String toSmallHump (String str ) {
114
+ return toHump (str , true );
115
+ }
116
+
117
+ private String toHump (String str , boolean isSmallHump ) {
118
+ StringBuilder builder = new StringBuilder ();
119
+ String [] strArr = str .split ("[ _-]" );
120
+ String subStr = "" ;
121
+ for (int index = 0 ; index < strArr .length ; index ++) {
122
+ subStr = strArr [index ];
123
+ if (index != 0 || !isSmallHump ) {
124
+ subStr = capitalize (subStr );
125
+ }
126
+ builder .append (subStr );
127
+ }
128
+ return builder .toString ();
129
+ }
130
+
131
+ public String capitalize (String str ) {
132
+ return str .substring (0 , 1 ).toUpperCase () + str .substring (1 );
133
+ }
134
+
135
+ private String obtainConstantTemplate (String className , String attribute ,
136
+ Map <String , Map <String , String >> dataMap ) {
137
+ StringBuilder builder = new StringBuilder ();
138
+ builder .append ("public interface " ).append (className ).append (" {\n " );
139
+ for (Map .Entry <String , Map <String , String >> data : dataMap .entrySet ()) {
140
+ String format = String .format ("\t String %s = \" %s\" ;\n " , data .getKey (), data .getValue ().get (attribute ));
141
+ builder .append (format );
142
+ }
143
+ builder .append ("}\r \n " );
144
+ return builder .toString ();
145
+ }
146
+
147
+ private String obtainEnumTemplate (String className , Map <String , Map <String , String >> dataMap ) {
148
+ String format = "public enum %s {\n " + "%s\n " + "%s\n " + "%s\n " + "%s" + "}" ;
149
+ return String .format (format , className , obtainEnumDataList (dataMap ), obtainEnumConstructor (className ),
150
+ obtainEnumProperty (), obtainEnumPropertyGetter ());
151
+ }
152
+
153
+ private String obtainEnumDataList (Map <String , Map <String , String >> dataMap ) {
154
+ StringBuilder builder = new StringBuilder ();
155
+ List <String > propertyList = obtainEnumPropertyList ();
156
+ ArrayList <String > nameList = new ArrayList <>(dataMap .keySet ());
157
+ for (int index = 0 ; index < nameList .size (); index ++) {
158
+ String separator = index < nameList .size () - 1 ? "," : ";" ;
159
+ String name = nameList .get (index );
160
+ Map <String , String > itemMap = dataMap .get (name );
161
+ String propertyArrString = propertyList .stream ()
162
+ .map (property -> String .format ("\" %s\" " , itemMap .get (property )))
163
+ .collect (Collectors .joining (", " , "(" , ")" ));
164
+
165
+ builder .append ("\t " ).append (name ).append (propertyArrString ).append (separator ).append ("\n " );
166
+ }
167
+ return builder .toString ();
168
+ }
169
+
170
+ private String obtainEnumConstructor (String className ) {
171
+ StringBuilder builder = new StringBuilder ();
172
+ List <String > propertyList = obtainEnumPropertyList ();
173
+ String propertyArrString = propertyList .stream ()
174
+ .map (property -> String .format ("String %s" , obtainPropertyName (property )))
175
+ .collect (Collectors .joining (", " , "(" , ")" ));
176
+
177
+ builder .append ("\t " ).append (className ).append (propertyArrString ).append (" {\n " );
178
+
179
+ for (String property : propertyList ) {
180
+ builder .append ("\t \t this." ).append (property ).append (" = " ).append (property ).append (";\n " );
181
+ }
182
+
183
+ builder .append ("\t }\n " );
184
+ return builder .toString ();
185
+ }
186
+
187
+ private String obtainEnumProperty () {
188
+ StringBuilder builder = new StringBuilder ();
189
+ List <String > propertyList = obtainEnumPropertyList ();
190
+ for (String property : propertyList ) {
191
+ builder .append ("\t private String " ).append (obtainPropertyName (property )).append (";\n " );
192
+ }
193
+ return builder .toString ();
194
+ }
195
+
196
+ private String obtainEnumPropertyGetter () {
197
+ StringBuilder builder = new StringBuilder ();
198
+ List <String > propertyList = obtainEnumPropertyList ();
199
+ for (String property : propertyList ) {
200
+ builder .append ("\t public String get" ).append (toBigHump (property )).append ("() {\n " );
201
+ builder .append ("\t \t return " ).append (obtainPropertyName (property )).append (";\n " ).append ("\t }\n \n " );
202
+ }
203
+ return builder .toString ();
204
+ }
205
+
206
+ private List <String > obtainEnumPropertyList () {
207
+ return attributeList ;
208
+ }
209
+
210
+ private String obtainOutputFilePath (String name ) {
211
+ preGenerateDir (outputDir );
212
+ return String .format ("%s%s%s.%s" , outputDir , File .separator , name , FILE_SUFFIX_NAME );
213
+ }
214
+
215
+ private void preGenerateDir (String directory ) {
216
+ File file = new File (directory );
217
+ if (!file .exists () && !file .isDirectory ()) {
218
+ file .mkdirs ();
219
+ }
220
+ }
221
+
222
+ private File preGenerateFile (String filePath ) throws IOException {
223
+ File file = new File (filePath );
224
+ if (!file .exists ()) {
225
+ file .createNewFile ();
226
+ }
227
+ return file ;
228
+ }
229
+
230
+ private void generateFile (String filePath , String content ) {
231
+ PrintWriter writer = null ;
232
+ try {
233
+ File file = preGenerateFile (filePath );
234
+ writer = new PrintWriter (new FileOutputStream (file ));
235
+ writer .write (content );
236
+ writer .flush ();
237
+ } catch (IOException e ) {
238
+ e .printStackTrace ();
239
+ } finally {
240
+ if (writer != null ) {
241
+ writer .close ();
242
+ }
243
+ }
244
+ }
245
+
246
+ private List <String > parseFile (String filePath ) {
247
+ List <String > list = new ArrayList <>();
248
+ BufferedReader reader = null ;
249
+ try {
250
+ String line ;
251
+ reader = new BufferedReader (new FileReader (filePath ));
252
+ while ((line = reader .readLine ()) != null ) {
253
+ list .add (line );
254
+ }
255
+ } catch (IOException e ) {
256
+ e .printStackTrace ();
257
+ } finally {
258
+ try {
259
+ if (reader != null ) {
260
+ reader .close ();
261
+ }
262
+ } catch (IOException e ) {
263
+ e .printStackTrace ();
264
+ }
265
+ }
266
+ return list ;
267
+ }
268
+
269
+ public static void main (String [] args ) {
270
+ String currentPath = new File ("" ).getAbsolutePath ();
271
+ String inputFile = currentPath + File .separator + "error-code.csv" ;
272
+ String outputDir = currentPath + File .separator + "output" + File .separator + "java" ;
273
+ new Generator (inputFile , outputDir ).generate ();
274
+ }
275
+ }
0 commit comments