# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-#
# File : IDLparser.py
# Module : SALOME
-#
+
import string, sys, fpformat, re, os
import xml.sax
import pdb
res = opt[s.end():]
break #found
- return res
+ return res
#--------------------------------------------------
# base class implementing tree
#--------------------------------------------------
class Tree:
-
+
def __init__(self, name = '', content = '', key = None):
self.name = name
self.content = content
self.childs = []
self.comments = []
self.attrs={}
-
+
def addChild(self, tree):
- if tree is not None:
+ if tree is not None:
self.childs.append(tree)
tree.parent = self
return tree
pos += 1
return self.addChild(tree)
-
+
def insertFirstChild(self, tree):
if tree is not None:
self.childs.insert(0, tree)
return tree
-
+
def insertFirstNamedChild(self, name, content = ''):
return self.insertFirstChild(Tree(name, content))
d = depth
if self.name != '':
s = string.ljust('', 4*depth)
- s += '<' + self.name
+ s += '<' + self.name
for k,v in self.attrs.items():
s += ' ' + k + '="' + v + '"'
s += '>'
s += '\n'
f.write(s)
d += 1
-
+
for i in self.childs:
i.output_xml(f, d)
-
+
if self.name != '':
s = '</' + self.name + '>\n'
if len(self.childs) > 0 :
def Dump(self, levels=-1, depth=0):
#Dumps the tree contents
-
+
if levels == 0: return
-
+
s = string.ljust('', 4*depth)
print s, self, self.content
for i in self.childs:
l.append(p.name)
p = p.parent
return l
-
+
def getChild(self, name, content=None):
# return child node with a given name
# if content == None, don't compare contents
if (self.name == name):
if (content is None) | (self.content == content):
return self
-
+
if (depth != 0):
for i in self.childs:
n = i.getNode(name, content, depth-1)
- if n: return n
-
+ if n: return n
+
return None
def __repr__(self):
L_int = self.getChild(list)
L_merge = Tree(list)
-
+
for i_ext in L_ext.childs:
k_ext = i_ext.key
if k_ext is None: continue
present = 0
-
+
for i_int in L_int.childs:
k_int = i_int.key
if k_int is None: continue
-
+
if (k_int == k_ext):
present = 1
break;
-
+
if present :
i_int.merge(i_ext)
L_merge.addChild(i_int)
else:
L_merge.addChild(i_ext)
-
+
self.replaceChild(L_merge)
def setAttrib(self, name,value):
self.attrs[name]=value
-
-
+
#--------------------------------------------------
# implements parameter tree
#--------------------------------------------------
class parameter(Tree):
-
+
def __init__(self, name=None, mode = 'in', type='', comment='unknown'):
Tree.__init__(self, mode + 'Parameter', key=name)
self.mode = mode
if name is None: return
-
+
self.addNamedChild(mode + 'Parameter-name', name)
self.addNamedChild(mode + 'Parameter-type', type)
self.addNamedChild(mode + 'Parameter-comment', comment)
-
+
def merge(self, P):
self.mode = P.mode
C = P.getChild(P.mode + 'Parameter-comment')
if C.content != 'unkonwn':
self.replaceChild(C)
-
+
#--------------------------------------------------
# implements dataStreamParameter tree
#--------------------------------------------------
class dataStreamParameter(parameter):
-
+
def __init__(self, name=None, mode='in', type='', dependency='', comment='unknown'):
parameter.__init__(self, name, mode, type, comment)
if name is None: return
-
+
self.addNamedChild(mode + 'Parameter-dependency', dependency)
self.mode = mode
-
+
def merge(self, P):
parameter.merge(self, P)
spaces = '[\t\n ]*'
word = spaces + '([a-zA-Z][a-zA-Z0-9_]*)' + spaces
-
+
result = []
type = None
key = None
-
+
## match : // followed by a 'DataStreamPorts' string,
## the service name, and a list of ports
pattern = '// *DataStreamPorts{,1}' + word
## service
type = 'DataStreamPorts'
key = m.group(1)
-
+
sPorts = comment[m.end():]
pattern = word + '\('+word+','+word +','+word+'\)' \
+ spaces + ',{,1}' + spaces
'format error in DataStreamPort definition : '+sPorts
sPorts = sPorts[m.end():]
result.append(m.groups())
-
+
return type, key, result;
#--------------------------------------------------
# implements service tree
#--------------------------------------------------
class Service(Tree):
-
+
def __init__(self, name=None, comment = 'unknown'):
-
+
Tree.__init__(self, 'component-service', key=name)
if name is None: return
-
+
self.addNamedChild('service-name', name)
self.addNamedChild('service-author',common_data["AUTHOR"])
self.addNamedChild('service-version',common_data["VERSION"])
self.addNamedChild('inParameter-list')
self.addNamedChild('outParameter-list')
self.addNamedChild('DataStream-list')
-
+
def createInParameter(self, name, type):
L = self.getChild('inParameter-list')
p = parameter(name, 'in', type)
L.replaceChild(p)
return p
-
+
def createOutParameter(self, name, type):
L = self.getChild('outParameter-list')
p = parameter(name, 'out', type)
p = dataStreamParameter(p[0], p[2], p[1], p[3])
L.replaceChild(p)
return p
-
+
def merge(self, S):
self.replaceChild(S.getChild('service-author'))
C = S.getChild('service-comment')
if C.content != 'unkonwn':
self.replaceChild(C)
-
+
for L in ['inParameter-list', 'outParameter-list', 'DataStream-list']:
self.mergeChilds(S, L)
-
#--------------------------------------------------
# implements interface tree
#--------------------------------------------------
class Interface(Tree):
-
+
def __init__(self, name=None, comment='unknown'):
-
+
Tree.__init__(self, key=name)
if name is None: return
-
+
self.addNamedChild('component-interface-name', name)
self.addNamedChild('component-interface-comment', comment);
self.addNamedChild('component-service-list')
-
+
def createService(self, name):
L = self.getChild('component-service-list')
if S.key == key:
return S
return None
-
+
def merge(self, I):
C = S.getChild('component-interface-comment')
self.replaceChild(C)
self.mergeChilds(I, 'component-service-list')
-
+
def processDataStreams(self):
for sComment in self.comments:
def __init__(self, name=None):
Tree.__init__(self, 'component', key=name)
if name is None: return
-
+
# ASV : fix for bug PAL8922 (Component name indicated by user in GUI is not taken into account
if common_data["COMP_NAME"] != '':
self.addNamedChild('component-name', common_data["COMP_NAME"])
self.addNamedChild('component-username', common_data["COMP_NAME"] )
else:
self.addNamedChild('component-username', name)
-
+
self.addNamedChild('component-type', common_data["COMP_TYPE"])
self.addNamedChild('component-author', common_data["AUTHOR"])
self.addNamedChild('component-version', common_data["VERSION"])
self.addNamedChild('component-icone', common_data["ICON"])
self.addNamedChild('constraint')
self.addNamedChild('component-interface-list')
-
+
def createInterface(self, name):
L = self.getChild('component-interface-list')
if L is None:
int = ext
elif ext is not None and len(ext.content):
int.content = ext.content
-
+
Cc = C.getChild('component-comment')
if Cc.content != 'unkonwn':
self.replaceChild(Cc)
-
+
self.mergeChilds(C, 'component-interface-list')
-
+
#--------------------------------------------------
# implements document tree
#--------------------------------------------------
n.childs.insert(p+1,Tree('type-list'))
if n.getChild('component-list') is None:
n.addNamedChild('component-list')
-
+
def removeComponent(self, name):
complist = self.getNode('component-list')
idx = 0
if cname.content == name:
complist.childs.pop(idx)
print "Component " + name + " is removed"
- idx += 1
-
+ idx += 1
+
def startDocument(self):
self.list.append(self)
-
+
def startElement(self, name, attrs):
p = self.list[len(self.list)-1]
if name == 'component':
e = p.addNamedChild(name)
self.list.append(e)
self.buffer = ''
-
+
def endElement(self, name):
self.buffer = string.join(string.split(self.buffer), ' ')
p = self.list[len(self.list)-1]
p.key = p.getChild('component-name').content
self.buffer = ''
e = self.list.pop()
-
+
def characters(self, ch):
self.buffer += ch
def mergeComponent(self, comp):
-
+
L_int = self.getNode('component-list')
if L_int is None:
error("Catalog.mergeComponent : 'component-list' is not found")
return
-
+
i_ext = comp
present = 0
n_ext = i_ext.key
if (i_int.key == n_ext):
present = 1
break;
-
+
if present == 0:
print ' add component', i_ext.getChild('component-name').content
L_int.addChild(i_ext)
else:
print ' replace component', i_ext.getChild('component-name').content
i_int.merge(i_ext)
-
+
def mergeType(self, type):
L_int = self.getNode('type-list')
if L_int is None:
# class ModuleCatalogVisitor
#--------------------------------------------------
class ModuleCatalogVisitor (idlvisitor.AstVisitor):
-
+
def __init__(self, catalog):
self.catalog = catalog
self.EngineType = 0
self.currentScope=None
-
+
def visitAST(self, node):
for n in node.declarations():
if n.mainFile():
n.accept(self)
-
+
def visitModule(self, node):
self.currentScope=node
for n in node.definitions():
n.accept(self)
-
+
def visitInterface(self, node):
if node.mainFile():
self.EngineType = 0
-
+
for i in node.inherits():
s = i.scopedName();
if s[0] == "Engines":
- if s[1] == "Component":
+ if s[1] == "EngineComponent":
self.EngineType = 1; break
if s[1] == "Superv_Component":
self.EngineType = 2; break
-
+
if self.EngineType:
#This interface is a SALOME component
Comp = Component(node.identifier())
-
+
self.currentInterface = Comp.createInterface(node.identifier())
-
+
for c in node.callables():
if isinstance(c, idlast.Operation):
c.accept(self)
for c in node.declarations():
if isinstance(c, idlast.Struct):
c.accept(self)
-
+
for i in node.comments():
self.currentInterface.comments.append(str(i))
if self.EngineType == 2:
self.currentInterface.processDataStreams()
-
+
global nb_components
nb_components = nb_components + 1
self.catalog.mergeComponent(Comp)
self.catalog.mergeType(t)
self.EngineType = 0
-
+
def visitOperation(self, node):
self.currentService = self.currentInterface.createService \
(node.identifier())
-
+
node.returnType().accept(self)
if (self.currentType != "void"):
self.currentService.createOutParameter \
("return", self.currentType)
-
+
for c in node.parameters():
c.accept(self)
for i in node.comments():
self.currentInterface.comments.append(str(i))
-
+
def visitDeclaredType(self, type):
name=type.name()
scoped_name="/".join(type.scopedName())
self.currentType = scoped_name
-
+
def visitBaseType(self, type):
self.currentType = ttsMap[type.kind()]
-
+
def visitStringType(self, type):
self.currentType = "string"
-
+
def visitParameter(self, node):
node.paramType().accept(self)
if node.is_in():
if node.is_out():
self.currentService.createOutParameter \
(node.identifier(), self.currentType)
-
+
def visitSequenceType(self,type):
type.seqType().accept(self)
if type.bound() == 0:
# parse idl and store xml file
#--------------------------------------------------
def run(tree, args):
-
+
CatalogFileName=getParamValue("catalog", "CatalogModulePersonnel.xml", args)
if re.compile(".*?.xml$").match(CatalogFileName, 1) is None:
CatalogFileName = CatalogFileName + '.xml'
- #========= Read parameters ======================
+ #========= Read parameters ======================
common_data["ICON"] = getParamValue("icon", "", args)
common_data["AUTHOR"] = getParamValue("author", os.getenv("USER"), args)
common_data["VERSION"] = getParamValue("version", "1", args)
- common_data["COMP_NAME"] = getParamValue("name", "", args)
+ common_data["COMP_NAME"] = getParamValue("name", "", args)
common_data["COMP_UNAME"] = getParamValue("username", "", args)
common_data["COMP_TYPE"] = getParamValue("type", "OTHER", args)
common_data["COMP_MULT"] = getParamValue("multistudy", "1", args)
common_data["COMP_IMPL"] = getParamValue("impltype", "1", args)
print common_data
-
+
remove_comp = getParamValue("remove", "", args)
-
- #==================================================
-
+
+ #==================================================
+
if (os.path.exists(CatalogFileName)):
print "Importing", CatalogFileName
C = Catalog(CatalogFileName)
C = Catalog()
print "Reading idl file"
-
+
visitor = ModuleCatalogVisitor(C)
tree.accept(visitor)
## C.Dump()
-
+
if remove_comp :
C.removeComponent(remove_comp)
-
+
if (os.path.exists(CatalogFileName)):
print "Updating", CatalogFileName
CatalogFileName_old = CatalogFileName + '_old'
else:
CatalogFileName_old = ""
print "Writing", CatalogFileName
-
+
CatalogFileName_new = CatalogFileName + '_new'
f=open(CatalogFileName_new, 'w')
f.write("<?xml version='1.0' encoding='us-ascii' ?>\n\n")
os.rename(CatalogFileName_new, CatalogFileName)
if ((CatalogFileName_old != "") & os.path.exists(CatalogFileName_old)):
os.unlink(CatalogFileName_old)
-
+
print
print
print "Usage : omniidl -bIDLparser [-I<catalog files directory>]* -Wbcatalog=<my_catalog.xml>[,icon=<pngfile>][,version=<num>][,author=<name>][,name=<component_name>][,username=<component_username>][,multistudy=<component_multistudy>][,impltype=<implementation type : 0 (python), 1 (C++)>] <file.idl>"
print
-
-