Skip to content

Commit 9753e14

Browse files
author
Steve Powell
committed
Refactoring, simplification of codegen to introduce changes:
* build() no longer does parm checks * Method derived class constructors do checks * fields of Method derived classes are private final
1 parent c78a9a4 commit 9753e14

File tree

10 files changed

+114
-179
lines changed

10 files changed

+114
-179
lines changed

codegen.py

Lines changed: 78 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def java_constant_name(c):
4545
'timestamp': 'Date'
4646
}
4747

48-
javaTypesNeverNullInBuilder = set([
48+
javaTypesToCheckForNull = set([
4949
'String',
5050
'LongString',
5151
'Date'
@@ -113,22 +113,13 @@ def typeNameDefault(spec, a):
113113
java_field_default_value(java_field_type(spec, a.domain),
114114
a.defaultvalue))
115115

116-
def mandatoryAndNullCheckedFields(spec, m):
117-
fieldsToNullCheckInBuild = set([])
118-
mandatoryFields = set([])
119-
if m.arguments:
120-
for index, a in enumerate(m.arguments):
121-
(jfType, jfName, jfDefault) = typeNameDefault(spec,a)
122-
if jfType in javaTypesNeverNullInBuilder:
123-
fieldsToNullCheckInBuild.update([jfName])
124-
if a.defaultvalue == None:
125-
mandatoryFields.update([(jfType,jfName)])
126-
return (fieldsToNullCheckInBuild, mandatoryFields)
127-
128-
def builderCtorArgSignature(mandatoryFields):
129-
ctor_arg_signature_list = []
130-
ctor_arg_signature_string = ", ".join(ctor_arg_signature_list)
131-
return ctor_arg_signature_string
116+
def nullCheckedFields(spec, m):
117+
fieldsToNullCheck = set([])
118+
for a in m.arguments:
119+
(jfType, jfName, jfDefault) = typeNameDefault(spec,a)
120+
if jfType in javaTypesToCheckForNull:
121+
fieldsToNullCheck.add(jfName)
122+
return fieldsToNullCheck
132123

133124
#---------------------------------------------------------------------------
134125

@@ -156,19 +147,19 @@ def printFileHeader():
156147
def genJavaApi(spec):
157148
def printHeader():
158149
printFileHeader()
159-
print """package com.rabbitmq.client;
160-
161-
import java.io.IOException;
162-
import java.util.Map;
163-
import java.util.Date;
164-
165-
import com.rabbitmq.client.impl.ContentHeaderPropertyWriter;
166-
import com.rabbitmq.client.impl.ContentHeaderPropertyReader;
167-
import com.rabbitmq.client.impl.LongString;
168-
import com.rabbitmq.client.impl.LongStringHelper;
169-
170-
public interface AMQP {
171-
"""
150+
print "package com.rabbitmq.client;"
151+
print
152+
print "import java.io.IOException;"
153+
print "import java.util.Map;"
154+
print "import java.util.Date;"
155+
print
156+
print "import com.rabbitmq.client.impl.ContentHeaderPropertyWriter;"
157+
print "import com.rabbitmq.client.impl.ContentHeaderPropertyReader;"
158+
print "import com.rabbitmq.client.impl.LongString;"
159+
print "import com.rabbitmq.client.impl.LongStringHelper;"
160+
print
161+
print "public interface AMQP {"
162+
print
172163
print " public static class PROTOCOL {"
173164
print " public static final int MAJOR = %i;" % spec.major
174165
print " public static final int MINOR = %i;" % spec.minor
@@ -182,66 +173,42 @@ def printConstants():
182173

183174
def builder(c,m):
184175
def ctorCall(c,m):
185-
ctor_call = "return new com.rabbitmq.client.impl.AMQImpl.%s.%s(" % (java_class_name(c.name),java_class_name(m.name))
186-
ctor_arg_list = []
187-
if m.arguments:
188-
for index, a in enumerate(m.arguments):
189-
ctor_arg_list.append("{0}".format(java_field_name(a.name)))
190-
ctor_call += ", ".join(ctor_arg_list)
191-
ctor_call += ");"
192-
print " %s" % (ctor_call)
176+
ctor_call = "com.rabbitmq.client.impl.AMQImpl.%s.%s" % (java_class_name(c.name),java_class_name(m.name))
177+
ctor_arg_list = [ java_field_name(a.name) for a in m.arguments ]
178+
print " return new %s(%s);" % (ctor_call, ", ".join(ctor_arg_list))
193179

194180
def genFields(spec, m):
195-
(fieldsToNullCheckInBuild, mandatoryFields) = mandatoryAndNullCheckedFields(spec, m)
196-
if m.arguments:
197-
for index, a in enumerate(m.arguments):
198-
(jfType, jfName, jfDefault) = typeNameDefault(spec, a)
199-
if a.defaultvalue != None:
200-
print " private %s %s = %s;" % (jfType, jfName, jfDefault)
201-
else:
202-
print " private %s %s;" % (jfType, jfName)
203-
204-
def genBuilderCtor(m, mandatoryFields):
205-
ctor_arg_signature_string = builderCtorArgSignature(mandatoryFields)
206-
print " public Builder(%s) { }" % ctor_arg_signature_string
181+
for a in m.arguments:
182+
(jfType, jfName, jfDefault) = typeNameDefault(spec, a)
183+
if a.defaultvalue != None:
184+
print " private %s %s = %s;" % (jfType, jfName, jfDefault)
185+
else:
186+
print " private %s %s;" % (jfType, jfName)
207187

208188
def genArgMethods(spec, m):
209-
if m.arguments:
210-
for index, a in enumerate(m.arguments):
211-
(jfType, jfName, jfDefault) = typeNameDefault(spec, a)
212-
print " public final Builder %s(%s %s)" % (jfName, jfType, jfName)
213-
print " { this.%s = %s; return this; }" % (jfName, jfName)
214-
if jfType == "boolean":
215-
print " public final Builder %s()" % (jfName)
216-
print " { this.%s = true; return this; }" % (jfName)
217-
218-
def genBuildMethod(c,m,fieldsToNullCheckInBuild):
189+
for a in m.arguments:
190+
(jfType, jfName, jfDefault) = typeNameDefault(spec, a)
191+
print " public final Builder %s(%s %s)" % (jfName, jfType, jfName)
192+
print " { this.%s = %s; return this; }" % (jfName, jfName)
193+
if jfType == "boolean":
194+
print " public final Builder %s()" % (jfName)
195+
print " { return this.%s(true); }" % (jfName)
196+
197+
def genBuildMethod(c,m):
219198
print " public final %s build() {" % (java_class_name(m.name))
220-
221-
if fieldsToNullCheckInBuild:
222-
nullCheckClauses = []
223-
for f in fieldsToNullCheckInBuild:
224-
printGenNullCheckClause(f)
225199
ctorCall(c,m)
226200
print " }"
227201

228-
def printGenNullCheckClause(f):
229-
print " if(%s == null)" % (f)
230-
print " { throw new IllegalStateException("
231-
print " \"Invalid configuration: '%s' must be non-null.\");" % (f)
232-
print " }"
233-
234202
print
235203
print " // Builder for instances of %s.%s" % (java_class_name(c.name), java_class_name(m.name))
236204
print " public static class Builder"
237205
print " {"
238-
(fieldsToNullCheckInBuild, mandatoryFields) = mandatoryAndNullCheckedFields(spec, m)
239206
genFields(spec, m)
240207
print
241-
genBuilderCtor(m, mandatoryFields)
208+
print " public Builder() { }"
242209
print
243210
genArgMethods(spec, m)
244-
genBuildMethod(c,m,fieldsToNullCheckInBuild)
211+
genBuildMethod(c,m)
245212
print " }"
246213

247214
def printClassInterfaces():
@@ -281,18 +248,14 @@ def printWriteProperties(c):
281248
print " }"
282249

283250
def printPropertyDebug(c):
251+
appendList = [ "%s=\")\n .append(this.%s)\n .append(\""
252+
% (f.name, java_field_name(f.name))
253+
for f in c.fields ]
284254
print
285-
print " public void appendPropertyDebugStringTo(StringBuffer acc) {"
286-
print " acc.append(\"(\");"
287-
for index,f in enumerate(c.fields):
288-
print " acc.append(\"%s=\");" % (f.name)
289-
print " acc.append(this.%s);" % (java_field_name(f.name))
290-
if not index == len(c.fields) - 1:
291-
print " acc.append(\", \");"
292-
293-
print " acc.append(\")\");"
255+
print " public void appendArgumentDebugStringTo(StringBuffer acc) {"
256+
print " acc.append(\"(%s)\");" % ", ".join(appendList)
294257
print " }"
295-
258+
296259
def printClassProperties(c):
297260
print
298261
print " public static class %(className)s extends %(parentClass)s {" % {'className' : java_class_name(c.name) + 'Properties', 'parentClass' : 'com.rabbitmq.client.impl.AMQ' + java_class_name(c.name) + 'Properties'}
@@ -303,13 +266,10 @@ def printClassProperties(c):
303266
#constructor
304267
if c.fields:
305268
print
306-
print " public %sProperties ( " % (java_class_name(c.name))
307-
for index,f in enumerate(c.fields):
308-
sys.stdout.write( " %s %s" % (java_property_type(spec,f.domain),java_field_name(f.name)))
309-
if not index == len(c.fields) - 1:
310-
print ","
311-
312-
print ")"
269+
consParmList = [ "%s %s" % (java_property_type(spec,f.domain),java_field_name(f.name))
270+
for f in c.fields ]
271+
print " public %sProperties(" % (java_class_name(c.name))
272+
print " %s)" % (",\n ".join(consParmList))
313273
print " {"
314274
for f in c.fields:
315275
print " this.%s = %s;" % (java_field_name(f.name), java_field_name(f.name))
@@ -349,17 +309,17 @@ def printClassProperties(c):
349309
def genJavaImpl(spec):
350310
def printHeader():
351311
printFileHeader()
352-
print """package com.rabbitmq.client.impl;
353-
354-
import java.io.IOException;
355-
import java.io.DataInputStream;
356-
import java.util.Map;
357-
358-
import com.rabbitmq.client.AMQP;
359-
import com.rabbitmq.client.UnknownClassOrMethodId;
360-
import com.rabbitmq.client.UnexpectedMethodError;
361-
362-
public class AMQImpl implements AMQP {"""
312+
print "package com.rabbitmq.client.impl;"
313+
print
314+
print "import java.io.IOException;"
315+
print "import java.io.DataInputStream;"
316+
print "import java.util.Map;"
317+
print
318+
print "import com.rabbitmq.client.AMQP;"
319+
print "import com.rabbitmq.client.UnknownClassOrMethodId;"
320+
print "import com.rabbitmq.client.UnexpectedMethodError;"
321+
print
322+
print "public class AMQImpl implements AMQP {"
363323

364324
def printClassMethods(spec, c):
365325
print
@@ -377,10 +337,17 @@ def constructors():
377337
print
378338
argList = [ "%s %s" % (java_field_type(spec,a.domain),java_field_name(a.name)) for a in m.arguments ]
379339
print " public %s(%s) {" % (java_class_name(m.name), ", ".join(argList))
340+
341+
fieldsToNullCheckInCons = nullCheckedFields(spec, m)
342+
343+
for f in fieldsToNullCheckInCons:
344+
print " if(%s == null)" % (f)
345+
print " throw new IllegalStateException(\"Invalid configuration: '%s' must be non-null.\");" % (f)
346+
380347
for a in m.arguments:
381348
print " this.%s = %s;" % (java_field_name(a.name), java_field_name(a.name))
382349
print " }"
383-
350+
384351
consArgs = [ "rdr.read%s()" % (java_class_name(spec.resolveDomain(a.domain))) for a in m.arguments ]
385352
print " public %s(MethodArgumentReader rdr) throws IOException {" % (java_class_name(m.name))
386353
print " this(%s);" % (", ".join(consArgs))
@@ -393,36 +360,23 @@ def others():
393360
print " public String protocolMethodName() { return \"%s.%s\";}" % (c.name, m.name)
394361
print
395362
print " public boolean hasContent() { return %s; }" % (trueOrFalse(m.hasContent))
396-
397363
print
398364
print " public Object visit(MethodVisitor visitor) throws IOException"
399365
print " { return visitor.visit(this); }"
400-
366+
401367
def trueOrFalse(truthVal):
402368
if truthVal:
403369
return "true"
404370
else:
405371
return "false"
406372

407373
def argument_debug_string():
374+
appendList = [ "%s=\")\n .append(this.%s)\n .append(\""
375+
% (a.name, java_field_name(a.name))
376+
for a in m.arguments ]
408377
print
409378
print " public void appendArgumentDebugStringTo(StringBuffer acc) {"
410-
print " acc.append(\"(\");"
411-
for index, a in enumerate(m.arguments):
412-
print " acc.append(\"%s=\");" % (a.name)
413-
print " acc.append(this.%s);" % (java_field_name(a.name))
414-
if not index == len(m.arguments) - 1:
415-
print " acc.append(\",\");"
416-
print " acc.append(\")\");"
417-
print " }"
418-
419-
def read_arguments():
420-
print
421-
print " public void readArgumentsFrom(MethodArgumentReader reader)"
422-
print " throws IOException"
423-
print " {"
424-
for a in m.arguments:
425-
print " this.%s = reader.read%s();" % (java_field_name(a.name), java_class_name(spec.resolveDomain(a.domain)))
379+
print " acc.append(\"(%s)\");" % ", ".join(appendList)
426380
print " }"
427381

428382
def write_arguments():
@@ -441,17 +395,15 @@ def write_arguments():
441395
print " implements com.rabbitmq.client.AMQP.%s.%s" % (java_class_name(c.name), java_class_name(m.name))
442396
print " {"
443397
print " public static final int INDEX = %s;" % (m.index)
444-
if m.arguments:
445-
print
446-
for a in m.arguments:
447-
print " public %s %s;" % (java_field_type(spec, a.domain), java_field_name(a.name))
398+
print
399+
for a in m.arguments:
400+
print " private final %s %s;" % (java_field_type(spec, a.domain), java_field_name(a.name))
448401

449402
getters()
450403
constructors()
451404
others()
452405

453406
argument_debug_string()
454-
read_arguments()
455407
write_arguments()
456408

457409
print " }"

0 commit comments

Comments
 (0)