[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[certi-cvs] certi/scripts GenMsgBase.py GenMsgJava.py GenMs...
From: |
CERTI CVS commits |
Subject: |
[certi-cvs] certi/scripts GenMsgBase.py GenMsgJava.py GenMs... |
Date: |
Fri, 15 Jul 2011 12:22:05 +0000 |
CVSROOT: /sources/certi
Module name: certi
Changes by: Eric NOULARD <erk> 11/07/15 12:22:05
Modified files:
scripts : GenMsgBase.py GenMsgJava.py GenMsgCXX.py
GenerateMessages.py GenMsgAST.py
Log message:
Update CERTI Java message generator in order to tolerate the new
representation syntax.
This is not enough for a fully functional Java generator but this is
the first step
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenMsgBase.py?cvsroot=certi&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenMsgJava.py?cvsroot=certi&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenMsgCXX.py?cvsroot=certi&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenerateMessages.py?cvsroot=certi&r1=1.43&r2=1.44
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenMsgAST.py?cvsroot=certi&r1=1.19&r2=1.20
Patches:
Index: GenMsgBase.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenMsgBase.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- GenMsgBase.py 11 Jun 2010 12:43:12 -0000 1.6
+++ GenMsgBase.py 15 Jul 2011 12:22:01 -0000 1.7
@@ -19,7 +19,7 @@
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
## USA
##
-## $Id: GenMsgBase.py,v 1.6 2010/06/11 12:43:12 erk Exp $
+## $Id: GenMsgBase.py,v 1.7 2011/07/15 12:22:01 erk Exp $
## ----------------------------------------------------------------------------
# We use logging for ... logging :-)
@@ -55,7 +55,7 @@
self.commentLineBeginWith = commentLineBeginWith
self.logger = logging.Logger(self.generatorName() + 'Generator')
self.logger.setLevel(logging.ERROR)
- self.logger.addHandler(logging.StreamHandler(sys.stdout))
+ #self.logger.addHandler(logging.StreamHandler(sys.stdout))
self.__indentString = ' '
self.__indentLevel = 0
self.builtinTypeMap = {
@@ -101,6 +101,33 @@
else:
return name
+ def getRepresentationFor(self, name):
+ for native in self.AST.natives:
+ if name == native.name:
+ return native.getRepresentation()
+ return None
+
+ def getSerializeMethodName(self, name):
+ if name in self.serializeTypeMap.keys():
+ return self.serializeTypeMap[name]
+ else:
+ representation = self.getRepresentationFor(name)
+ if representation and not representation.hasQualifier():
+ return
self.getSerializeMethodName(representation.representation)
+
+ self.logger.warn("No serialize method for <%s>", name)
+ return None
+
+ def getDeSerializeMethodName(self, name):
+ if name in self.deserializeTypeMap.keys():
+ return self.deserializeTypeMap[name]
+ else:
+ representation = self.getRepresentationFor(name)
+ if representation and not representation.hasQualifier():
+ return
self.getDeSerializeMethodName(representation.representation)
+ self.logger.warn("No serialize method for <%s>", name)
+ return None
+
def lowerFirst(self, str):
res = str[0].lower() + str[1:]
return res
@@ -117,13 +144,10 @@
language has whole line comment support
with some beginning characters.
"""
-
if ASTElement.hasComment():
for line in ASTElement.comment.lines:
-
# we should not indent optional comment
# since they come at the end of a line
-
if not ASTElement.comment.isAtEOL:
stream.write(self.getIndent())
stream.write(self.commentLineBeginWith)
@@ -136,27 +160,26 @@
"""
Generate the header.
"""
-
self.logger.error('generateHeader not IMPLEMENTED')
def generateBody(self, stream, factoryOnly=False):
"""
Generate the body.
"""
-
self.logger.error('generateBody not IMPLEMENTED')
+ def addGeneratedByLine(self,stream):
+ stream.write(self.commentLineBeginWith)
+ stream.write(' Generated on %s by the CERTI message generator\n'
+ % datetime.datetime.now().strftime('%Y %B %a, %d at
%H:%M:%S'
+ ))
+
def generate(
self,
stream,
what,
- factoryOnly=False,
- ):
- stream.write(self.commentLineBeginWith)
- stream.write(' Generated on %s by the CERTI message generator\n'
+ factoryOnly=False):
- % datetime.datetime.now().strftime('%Y %B %a, %d at
%H:%M:%S'
- ))
if what.lower() == 'header':
self.generateHeader(stream, factoryOnly)
elif what.lower() == 'body':
@@ -166,7 +189,6 @@
class MsgSpecGenerator(CodeGenerator):
-
"""
This is a text generator for C{MessageAST}.
@@ -199,21 +221,17 @@
"""
# Generate package
-
if self.AST.hasPackage():
self.writeComment(stream, self.AST.package)
stream.write('package %s\n' % self.AST.package.name)
# Generate version
-
if self.AST.hasVersion():
self.writeComment(stream, self.AST.version)
stream.write('version %d.%d\n' % self.AST.version.number)
if not factoryOnly:
-
# Generate native type
-
for native in self.AST.natives:
self.writeComment(stream, native)
stream.write('native %s {\n' % native.name)
@@ -229,7 +247,6 @@
stream.write('}\n')
# Generate enum
-
for enum in self.AST.enums:
self.writeComment(stream, enum)
stream.write('enum %s {\n' % enum.name)
@@ -250,7 +267,6 @@
''')
# Generate message type
-
for msg in self.AST.messages:
self.writeComment(stream, msg)
stream.write('message %s' % msg.name)
@@ -287,7 +303,6 @@
''')
# Generate Factory
-
if self.AST.hasFactory():
self.writeComment(stream, self.AST.factory)
stream.write('factory %s {\n' % self.AST.factory.name)
@@ -301,5 +316,3 @@
stream.write('''}
''')
-
-
Index: GenMsgJava.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenMsgJava.py,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- GenMsgJava.py 11 Jun 2010 12:43:12 -0000 1.4
+++ GenMsgJava.py 15 Jul 2011 12:22:02 -0000 1.5
@@ -19,7 +19,7 @@
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
## USA
##
-## $Id: GenMsgJava.py,v 1.4 2010/06/11 12:43:12 erk Exp $
+## $Id: GenMsgJava.py,v 1.5 2011/07/15 12:22:02 erk Exp $
## ----------------------------------------------------------------------------
"""
@@ -31,6 +31,7 @@
import GenMsgBase
import GenMsgAST
import sys
+import os
class JavaGenerator(GenMsgBase.CodeGenerator):
@@ -151,58 +152,56 @@
""")
def generateHeader(self, stream, factoryOnly=False):
+ self.logger.warn("There is no 'header' for Java, only body.")
+ self.logger.warn("Header generation does sanity checks only")
for native in self.AST.natives:
if native.hasLanguage('Java'):
-
# This an example may be it would be worth to check whether if
the
- # refered native types are valids?
-
+ # referred native types are valids?
for line in native.getLanguageLines('Java'):
- stream.write('Found native **' + line.statement
- + '**\n')
+ self.logger.info('Found native **' + line.statement+ '**')
def prepareName(self, name):
upperAfterScore = lambda x: __import__('re').sub(r'_(.)',
lambda y: y.group(0).upper(), x)
+ if (name.find('_')>0):
return upperAfterScore(name.lower()).replace('_', '')[1:]
-
- def getSerializeMethodName(self, name):
- if name in self.serializeTypeMap.keys():
- return self.serializeTypeMap[name]
else:
- representation = self.getRepresentationFor(name)
- if representation:
- return self.getSerializeMethodName(representation)
- print 'No serialize method name for <%s> ' % name
- return None
-
- def getDeSerializeMethodName(self, name):
- if name in self.deserializeTypeMap.keys():
- return self.deserializeTypeMap[name]
- else:
- representation = self.getRepresentationFor(name)
- if representation:
- return self.getDeSerializeMethodName(representation)
- return None
-
- def getRepresentationFor(self, name):
- for native in self.AST.natives:
- if name == native.name:
- representation = native.getRepresentation()
- if representation:
- return representation
- return None
+ return name
def generateBody(self, stream, factoryOnly=False):
"""
Generate the body.
"""
+ # Java generator generates multiple files so close
+ # and delete the previously opened javaFile and create
+ # a directory with the same name instead
+ shouldCreateDir=False
+ if (isinstance(stream,file)):
+ mydirname = stream.name
+ if os.path.exists(mydirname):
+ os.remove(mydirname)
+ shouldCreateDir=True
+ elif (isinstance(stream,"".__class__)):
+ mydirname = stream
+ if not os.path.exists(mydirname):
+ shouldCreateDir = True
+ else:
+ self.logger.error("Unknown type of stream <%>" % type(stream))
+ if shouldCreateDir:
+ os.makedirs(mydirname)
+ self.logger.info("Generates java javaFile in %s directory" %
mydirname)
for msg in self.AST.messages:
- file = open('messages/' + self.prepareName(msg.name)
+ if os.path.exists(mydirname):
+ javaFile = open(mydirname +os.sep+ self.prepareName(msg.name)
+ '.java', 'w')
+ else:
+ javaFile = sys.stdout
+ javaFile.write("// ---------- %s ----------\n" %
(self.prepareName(msg.name)+'.java'))
- file.write("""//
----------------------------------------------------------------------------
+ self.addGeneratedByLine(javaFile)
+ javaFile.write("""//
----------------------------------------------------------------------------
// CERTI - HLA Run Time Infrastructure
// Copyright (C) 2010 Andrej Pancik
//
@@ -224,25 +223,25 @@
""")
if self.AST.hasPackage():
- file.write('package ' + self.AST.package.name
+ javaFile.write('package ' + self.AST.package.name
+ ''';
''')
- self.generateIncludes(file)
- file.write(self.getIndent() + 'public class '
+ self.generateIncludes(javaFile)
+ javaFile.write(self.getIndent() + 'public class '
+ self.prepareName(msg.name)
+ ' extends CertiMessage {\n')
self.indent()
if len(msg.fields) > 0:
for field in msg.fields:
- file.write(self.getIndent() + 'private ')
+ javaFile.write(self.getIndent() + 'private ')
# Combined field and "plain" field must not be treated the
same way
if not isinstance(field,
GenMsgAST.MessageType.CombinedField):
- self.writeFieldStatement(file, field)
+ self.writeFieldStatement(javaFile, field)
else:
# combined field may be written in a specific way
@@ -251,117 +250,111 @@
# generated
for cfield in field.fields:
- self.writeFieldStatement(file, cfield)
+ self.writeFieldStatement(javaFile, cfield)
- file.write('\n')
+ javaFile.write('\n')
# constructor
- file.write(self.getIndent() + 'public '
+ javaFile.write(self.getIndent() + 'public '
+ self.prepareName(msg.name) + '() {\n')
self.indent()
- file.write(self.getIndent() + 'super(CertiMessageType.'
+ javaFile.write(self.getIndent() + 'super(CertiMessageType.'
+ msg.name.upper()[2:] + ');\n')
self.unIndent()
- file.write(self.getIndent() + '''}
+ javaFile.write(self.getIndent() + '''}
''')
- file.write(self.getIndent() + 'public '
+ javaFile.write(self.getIndent() + 'public '
+ self.prepareName(msg.name)
+ '(CertiLogicalTime federationTime) {\n')
self.indent()
- file.write(self.getIndent() + 'super(CertiMessageType.'
+ javaFile.write(self.getIndent() + 'super(CertiMessageType.'
+ msg.name.upper()[2:] + ', federationTime);\n')
self.unIndent()
- file.write(self.getIndent() + '''}
+ javaFile.write(self.getIndent() + '''}
''')
- # file.write(self.getIndent() + "public " +
self.prepareName(msg.name) + "(double federationTime, attributes) {\n")
+ # javaFile.write(self.getIndent() + "public " +
self.prepareName(msg.name) + "(double federationTime, attributes) {\n")
# TODO attributes in constructor
# self.indent()
- # file.write(self.getIndent() + "super(CertiMessageType." +
msg.name.upper()[2:] + ", federationTime);\n")
+ # javaFile.write(self.getIndent() + "super(CertiMessageType." +
msg.name.upper()[2:] + ", federationTime);\n")
# TODO initialize local attributes
# self.unIndent()
- # file.write(self.getIndent() + "}\n\n");
+ # javaFile.write(self.getIndent() + "}\n\n");
if len(msg.fields) > 0:
- file.write(self.getIndent() + '@Override\n')
- file.write(self.getIndent()
+ javaFile.write(self.getIndent() + '@Override\n')
+ javaFile.write(self.getIndent()
+ 'public void writeMessage(MessageBuffer
messageBuffer) {\n'
)
self.indent()
- file.write(self.getIndent()
+ javaFile.write(self.getIndent()
+ '''super.writeMessage(messageBuffer); //Header
''')
for field in msg.fields:
-
+ methodName = self.getSerializeMethodName(field.typeid.name)
# Combined field and "plain" field must not be treated the
same way
-
if not isinstance(field,
- GenMsgAST.MessageType.CombinedField):
- file.write(self.getIndent()
- +
self.getSerializeMethodName(field.typeid.name)
+ GenMsgAST.MessageType.CombinedField) and
methodName:
+ javaFile.write(self.getIndent()
+ + methodName
% field.name + '\n')
- else:
-
+ elif methodName:
# FIXME TODO
-
for cfield in field.fields:
pass
self.unIndent()
- file.write(self.getIndent() + '''}
+ javaFile.write(self.getIndent() + '''}
''')
- file.write(self.getIndent() + '@Override\n')
- file.write(self.getIndent()
+ javaFile.write(self.getIndent() + '@Override\n')
+ javaFile.write(self.getIndent()
+ 'public void readMessage(MessageBuffer
messageBuffer) throws CertiException {\n'
)
self.indent()
- file.write(self.getIndent()
+ javaFile.write(self.getIndent()
+ '''super.readMessage(messageBuffer); //Header
''')
for field in msg.fields:
-
+ methodName = self.getSerializeMethodName(field.typeid.name)
# Combined field and "plain" field must not be treated the
same way
-
if not isinstance(field,
- GenMsgAST.MessageType.CombinedField):
- file.write(self.getIndent()
- +
self.getDeSerializeMethodName(field.typeid.name)
+ GenMsgAST.MessageType.CombinedField) and
methodName:
+ javaFile.write(self.getIndent()
+ + methodName
% field.name + '\n')
- else:
-
+ elif methodName:
# FIXME TODO
-
for cfield in field.fields:
pass
self.unIndent()
- file.write(self.getIndent() + '''}
+ javaFile.write(self.getIndent() + '''}
''')
- file.write(self.getIndent() + '@Override\n')
- file.write(self.getIndent()
+ javaFile.write(self.getIndent() + '@Override\n')
+ javaFile.write(self.getIndent()
+ 'public String toString() {\n')
self.indent()
- file.write(self.getIndent() + 'return (super.toString()'
+ javaFile.write(self.getIndent() + 'return (super.toString()'
)
for field in msg.fields:
- file.write(' + ", ' + field.name + ': " + '
+ javaFile.write(' + ", ' + field.name + ': " + '
+ field.name)
- file.write(');\n')
+ javaFile.write(');\n')
self.unIndent()
- file.write(self.getIndent() + '''}
+ javaFile.write(self.getIndent() + '''}
''')
@@ -373,16 +366,16 @@
if not isinstance(field,
GenMsgAST.MessageType.CombinedField):
- file.write(self.getIndent() + 'public '
+ javaFile.write(self.getIndent() + 'public '
+ self.getTargetTypeName(field.typeid.name)
+ ' get'
+ field.name[0].capitalize()
+ field.name[1:] + '() {\n')
self.indent()
- file.write(self.getIndent() + 'return '
+ javaFile.write(self.getIndent() + 'return '
+ field.name + ';\n')
self.unIndent()
- file.write(self.getIndent() + '''}
+ javaFile.write(self.getIndent() + '''}
''')
@@ -394,7 +387,7 @@
if not isinstance(field,
GenMsgAST.MessageType.CombinedField):
- file.write(self.getIndent() + 'public void set'
+ javaFile.write(self.getIndent() + 'public void set'
+ field.name[0].capitalize()
+ field.name[1:] + '('
+ self.getTargetTypeName(field.typeid.name)
@@ -402,16 +395,16 @@
+ field.name[0].capitalize()
+ field.name[1:] + ') {\n')
self.indent()
- file.write(self.getIndent() + 'this.'
+ javaFile.write(self.getIndent() + 'this.'
+ field.name + ' = new'
+ field.name[0].capitalize()
+ field.name[1:] + ';\n')
self.unIndent()
- file.write(self.getIndent() + '''}
+ javaFile.write(self.getIndent() + '''}
''')
- file.write('''}
+ javaFile.write('''}
''')
self.unIndent()
Index: GenMsgCXX.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenMsgCXX.py,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- GenMsgCXX.py 13 Jul 2011 15:43:17 -0000 1.21
+++ GenMsgCXX.py 15 Jul 2011 12:22:03 -0000 1.22
@@ -20,7 +20,7 @@
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
## USA
##
-## $Id: GenMsgCXX.py,v 1.21 2011/07/13 15:43:17 erk Exp $
+## $Id: GenMsgCXX.py,v 1.22 2011/07/15 12:22:03 erk Exp $
## ----------------------------------------------------------------------------
"""
@@ -117,30 +117,6 @@
else:
return name
- def getRepresentationFor(self, name):
- for native in self.AST.natives:
- if name == native.name:
- return native.getRepresentation()
- return None
-
- def getSerializeMethodName(self, name):
- if name in self.serializeTypeMap.keys():
- return self.serializeTypeMap[name]
- else:
- representation = self.getRepresentationFor(name)
- if representation and not representation.hasQualifier():
- return
self.getSerializeMethodName(representation.representation)
- return None
-
- def getDeSerializeMethodName(self, name):
- if name in self.deserializeTypeMap.keys():
- return self.deserializeTypeMap[name]
- else:
- representation = self.getRepresentationFor(name)
- if representation and not representation.hasQualifier():
- return
self.getDeSerializeMethodName(representation.representation)
- return None
-
def openNamespaces(self, stream):
if self.AST.hasPackage():
self.writeComment(stream, self.AST.package)
@@ -346,9 +322,8 @@
% enum.name)
def generateHeader(self, stream, factoryOnly=False):
-
+ self.addGeneratedByLine(stream)
# write the usual header protecting MACRO
-
supposedHeaderName = stream.name
if supposedHeaderName != '<stdout>':
supposedHeaderName = os.path.basename(supposedHeaderName)
@@ -979,12 +954,10 @@
"""
Generate the body.
"""
-
+ self.addGeneratedByLine(stream)
# add necessary standard includes
-
stream.write('#include <vector>\n')
stream.write('#include <string>\n')
-
# [Try to] add corresponding header include
supposedHeaderName = stream.name
Index: GenerateMessages.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenerateMessages.py,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -b -r1.43 -r1.44
--- GenerateMessages.py 13 Jul 2011 15:43:17 -0000 1.43
+++ GenerateMessages.py 15 Jul 2011 12:22:04 -0000 1.44
@@ -20,7 +20,7 @@
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
## USA
##
-## $Id: GenerateMessages.py,v 1.43 2011/07/13 15:43:17 erk Exp $
+## $Id: GenerateMessages.py,v 1.44 2011/07/15 12:22:04 erk Exp $
## ----------------------------------------------------------------------------
"""
@@ -111,7 +111,7 @@
GenMsgC.CCERTIGenerator
def usage():
- print 'Usage:\n%s --input=<message> [--language=<lang>]
[--type=header|body] [--factory-only] [--output=<filename>] [--verbose]
[--help]' \
+ print 'Usage:\n%s --input=<message> [--language=<lang>]
[--type=header|body] [--factory-only] [--output=<filename>|<output directory>]
[--verbose] [--help]' \
% os.path.basename(sys.argv[0])
print ' Supported target languages are:'
for gene in generatorBackends.values():
@@ -144,6 +144,7 @@
gentype = 'header'
language = GenMsgBase.MsgSpecGenerator.generatorName()
output = sys.stdout
+oname = 'stdout'
inputFile = None
# Parse command line options
@@ -158,7 +159,16 @@
if o in ('-f', '--factory-only'):
factoryOnly = True
if o in ('-o', '--output'):
+ try:
output = open(a, mode='w')
+ oname = a
+ except IOError, err:
+ if (os.path.isdir(a)):
+ mainlogger.warn('output argument <%s> is a directory, passing
it as-is to the generator'%a)
+ output = a
+ oname = a
+ else:
+ mainlogger.error('unable to create output file <%s> [err=%s]'
% (a,err))
if o in ('-v', '--verbose'):
verbose = True
mainlogger.setLevel(logging.INFO)
@@ -167,7 +177,7 @@
sys.exit(0)
mainlogger.info('Reading message specifications from: <%s>' % inputFile)
-mainlogger.info('output send to: <%s>' % repr(output.name))
+mainlogger.info('output send to: <%s>' % oname)
mainlogger.info('Generating for language: <%s>' % language)
# Lexer+Parser specification begins here
@@ -713,6 +723,9 @@
usage()
if generator != None:
+ generator.logger.addHandler(stdoutHandler)
+ if verbose:
+ generator.logger.setLevel(logging.INFO)
generator.generate(output, gentype, factoryOnly)
mainlogger.info('Generate %s from AST, Done.' % language)
msgFile.close()
Index: GenMsgAST.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenMsgAST.py,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- GenMsgAST.py 13 Jul 2011 15:43:17 -0000 1.19
+++ GenMsgAST.py 15 Jul 2011 12:22:04 -0000 1.20
@@ -20,7 +20,7 @@
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
## USA
##
-## $Id: GenMsgAST.py,v 1.19 2011/07/13 15:43:17 erk Exp $
+## $Id: GenMsgAST.py,v 1.20 2011/07/15 12:22:04 erk Exp $
## ----------------------------------------------------------------------------
"""
@@ -1081,6 +1081,8 @@
if not self.checkMessageFields(f, AST):
return False
else:
+ f.typeid = AST.getType(f.typeid)
+ else:
self.logger.fatal('Unknown MessageField type %s'
% f.str())
return False
@@ -1128,9 +1130,7 @@
parent = AST.getType(msg.merge)
parent.nbHeir += 1
if None != lastMerge:
-
# recurse to find root merge
-
rootMerge = AST.getRootMergeType(msg.merge)
if lastMerge != rootMerge:
blah = AST.getRootMergeType(msg.merge, 1)
@@ -1165,7 +1165,6 @@
# check if merger are either native or message
# @todo should check that merger is not an enum
-
for msg in AST.messages:
if msg.hasMerge():
if not AST.isDefined(msg.merge):
@@ -1193,7 +1192,6 @@
self.logger.fatal(' --> Check lines (%d,%d)'
% AST.factory.linespan + ' of <%s>'
% AST.name)
-
return
if AST.factory.hasFactoryReceiver():
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [certi-cvs] certi/scripts GenMsgBase.py GenMsgJava.py GenMs...,
CERTI CVS commits <=