Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,7 @@ __xtuml_lextab.py
__xtuml_parsetab.py
__oal_lextab.py
__oal_parsetab.py
build
dist
pyxtuml.egg-info
.history
4 changes: 1 addition & 3 deletions bridgepoint/oal.py
Original file line number Diff line number Diff line change
Expand Up @@ -2013,9 +2013,7 @@ def p_unary_operator(self, p):

def p_error(self, p):
if p:
raise ParseException("invalid token '%s' at %s:%s" % (p.type,
p.lineno,
find_column(p.lexer.lexdata, p.lexpos)))
raise ParseException("invalid token '%s' at line: %s, column: %s" % (p.type,p.lineno, find_column(p.lexer.lexdata, p.lexpos)))
else:
raise ParseException("unknown parsing error")

Expand Down
121 changes: 84 additions & 37 deletions bridgepoint/prebuild.py
Original file line number Diff line number Diff line change
Expand Up @@ -1480,6 +1480,7 @@ def accept_GeneratePortEventNode(self, node):
return act_smt

class BridgePrebuilder(ActionPrebuilder):
element_type = "Bridge"
def __init__(self, metamodel, s_brg):
self._s_brg = s_brg
s_ee = one(s_brg).S_EE[19]()
Expand All @@ -1489,8 +1490,11 @@ def __init__(self, metamodel, s_brg):
@property
def label(self):
s_ee = one(self._s_brg).S_EE[19]()
return '%s::%s' % (s_ee.Name, self._s_brg.Name)

comp_name = ""
if self.c_c is not None:
comp_name = self.c_c.Name + "::"
return '%s%s::%s' % (comp_name, s_ee.Name, self._s_brg.Name)

def accept_BodyNode(self, node):
act_brb = self.new('ACT_BRB')
relate(act_brb, self._s_brg, 697)
Expand All @@ -1514,15 +1518,16 @@ def accept_ParamAccessNode(self, node):


class FunctionPrebuilder(ActionPrebuilder):
element_type = "Function"
def __init__(self, metamodel, s_sync):
self._s_sync = s_sync
c_c = get_defining_component(s_sync)
ActionPrebuilder.__init__(self, metamodel, c_c)

@property
def label(self):
return self._s_sync.Name
return '%s::%s' % (self.c_c.Name, self._s_sync.Name)

def accept_BodyNode(self, node):
act_fnb = self.new('ACT_FNB')
relate(act_fnb, self._s_sync, 695)
Expand All @@ -1549,7 +1554,7 @@ def accept_ParamAccessNode(self, node):


class OperationPrebuilder(ActionPrebuilder):

element_type = "Operation"
def __init__(self, metamodel, o_tfr):
self._o_tfr = o_tfr
self._o_obj = one(o_tfr).O_OBJ[115]()
Expand All @@ -1566,8 +1571,8 @@ def find_symbol(self, node, name):

@property
def label(self):
return '%s::%s' % (self._o_obj.Name, self._o_tfr.Name)
return '%s::%s::%s' % (self.c_c.Name, self._o_obj.Name, self._o_tfr.Name)

def accept_BodyNode(self, node):
act_opb = self.new('ACT_OPB')
relate(act_opb, self._o_tfr, 696)
Expand All @@ -1594,12 +1599,24 @@ def accept_ParamAccessNode(self, node):


class TransitionPrebuilder(ActionPrebuilder):

element_type = ""
action_owner_name = ""
def __init__(self, metamodel, sm_act):
self._sm_act = sm_act
self._sm_evt = one(
sm_act).SM_AH[514].SM_TAH[513].SM_TXN[530].SM_NSTXN[507].SM_SEME[504].SM_SEVT[503].SM_EVT[525]()
self._sm_state = one(sm_act).SM_AH[514].SM_MOAH[513].SM_STATE[511]()
self._o_obj = (one(sm_act).SM_SM[515].SM_ISM[517].O_OBJ[518]() or
one(sm_act).SM_SM[515].SM_ASM[517].O_OBJ[519]())
c_c = get_defining_component(self._o_obj)
self.action_owner_name = ""
if self._sm_evt is not None:
self.element_type = "Transition"
self.action_owner_name = self.get_event_name(self._sm_evt)
else:
self.element_type = "State"
self.action_owner_name = self._sm_state.Name

ActionPrebuilder.__init__(self, metamodel, c_c)

def find_symbol(self, node, name):
Expand All @@ -1609,11 +1626,28 @@ def find_symbol(self, node, name):
v_var = one(v_int).V_VAR[814]()

return v_var

@property

def get_event_name(self, event):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This method is difficult to read and understand.

Could you flatten the conditions a bit, and add comment on each case?
I tried my best to write a sugestion, but I do not have access to the metamodel at the moment.
Here is a possibly incorrect example that points towards my intentions.

def get_event_name(sm_evt):
    sm_nlevt = one(sm_evt).SM_SEVT[525].SM_NLEVT[526]()
    sm_sgevt = one(sm_evt).SM_SEVT[525].SM_SGEVT[526]()
    sm_pect = one(sm_nlevt).SM_PEVT[527]()

    # non-local polymorphic event
    if sm_pect and sm_pect.SM_ID != sm_nlevt.SM_ID:
        return sm_evt.Drv_Lbl + ": " + sm_evt.Mning

    # local polymorphic event
    if sm_pect:
        return sm_evt.Mning + "::" + sm_pect.localClassName

    # orphan, what is this?
    if sm_nlevt:
        return event.Mning + "::Orphaned"

    # case 4
    if sm_sgevt:
        return sm_evt.Drv_Lbl

    # case 5
    return sm_evt.Drv_Lbl + ": " + sm_evt.Mning

sm_nlevt = one(event).SM_SEVT[525].SM_NLEVT[526]()
sm_sgevt = one(event).SM_SEVT[525].SM_SGEVT[526]()
sm_pevt = one(sm_nlevt).SM_PEVT[527]()
# If polymorphic and the polymorphic event is not local
# use the poly local class name
if sm_pevt is not None and sm_pevt.SM_ID != sm_nlevt.SM_ID:
return event.Mning + "::" + sm_pevt.localClassName
# If an orphaned polymorphic, append that to the name
if sm_nlevt is not None and sm_pevt is None:
return event.Mning + "::Orphaned"
# If a signal event we use only the derived label
if sm_sgevt is not None:
return event.Drv_Lbl
# otherwise we combine the label with the event Mning
return event.Drv_Lbl + ": " + event.Mning

@ property
def label(self):
return ''
return '%s::%s::%s' % (self.c_c.Name, self._o_obj.Name, self.action_owner_name)

def accept_BodyNode(self, node):
sm_moah = one(self._sm_act).SM_AH[514].SM_MOAH[513]()
if sm_moah is not None:
Expand Down Expand Up @@ -1664,7 +1698,7 @@ def accept_ParamAccessNode(self, node):


class DerivedAttributePrebuilder(ActionPrebuilder):

element_type = "Derived Base Attribute"
def __init__(self, metamodel, o_dbattr):
self._o_dbattr = o_dbattr
self._o_obj = one(o_dbattr).O_BATTR[107].O_ATTR[106].O_OBJ[102]()
Expand All @@ -1682,8 +1716,8 @@ def find_symbol(self, node, name):
@property
def label(self):
o_attr = one(self._o_dbattr).O_BATTR[107].O_ATTR[106]()
return '%s::%s' % (self._o_obj.Name, o_attr.Name)
return '%s::%s::%s' % (self.c_c.Name, self._o_obj.Name, o_attr.Name)

def accept_BodyNode(self, node):
act_dab = self.new('ACT_DAB')
relate(act_dab, self._o_dbattr, 693)
Expand All @@ -1698,19 +1732,21 @@ def accept_BodyNode(self, node):


class RequiredOperationPrebuilder(ActionPrebuilder):

element_type = "Required Operaton"
def __init__(self, metamodel, spr_ro):
self._spr_ro = spr_ro
c_c = one(spr_ro).SPR_REP[4502].C_R[4500].C_IR[4009].C_PO[4016].C_C[4010]()
ActionPrebuilder.__init__(self, metamodel, c_c)
c_c = one(
spr_ro).SPR_REP[4502].C_R[4500].C_IR[4009].C_PO[4016].C_C[4010]()
ActionPrebuilder.__init__(self, metamodel, c_c)

@property
def label(self):
# interface = one(self._spr_ro).SPR_REP[4502].C_R[4500].C_IR[4009].C_I[4012]()
# port = one(self._spr_ro).SPR_REP[4502].C_R[4500].C_IR[4009].C_PO[4016]()
# return '%s::%s::%s' % (port.Name, interface.Name, self._spr_ro.Name)
return ''

c_i = one(
self._spr_ro).SPR_REP[4502].C_R[4500].C_IR[4009].C_I[4012]()
c_po = one(
self._spr_ro).SPR_REP[4502].C_R[4500].C_IR[4009].C_PO[4016]()
return '%s::%s::%s::%s' % (self.c_c, c_po.Name, c_i.Name, self._spr_ro.Name)

def accept_BodyNode(self, node):
act_rob = self.new('ACT_ROB')
relate(act_rob, self._spr_ro, 685)
Expand All @@ -1734,16 +1770,20 @@ def accept_ParamAccessNode(self, node):


class RequiredSignalPrebuilder(ActionPrebuilder):

element_type = "Required Signal"
def __init__(self, metamodel, spr_rs):
self._spr_rs = spr_rs
c_c = one(spr_rs).SPR_REP[4502].C_R[4500].C_IR[4009].C_PO[4016].C_C[4010]()
ActionPrebuilder.__init__(self, metamodel, c_c)

@property
def label(self):
return ''

c_i = one(
self._spr_rs).SPR_REP[4502].C_R[4500].C_IR[4009].C_I[4012]()
c_po = one(
self._spr_rs).SPR_REP[4502].C_R[4500].C_IR[4009].C_PO[4016]()
return '%s::%s::%s::%s' % (self.c_c, c_po.Name, c_i.Name, self._spr_rs.Name)

def accept_BodyNode(self, node):
act_rsb = self.new('ACT_RSB')
relate(act_rsb, self._spr_rs, 684)
Expand All @@ -1767,19 +1807,20 @@ def accept_ParamAccessNode(self, node):


class ProvidedOperationPrebuilder(ActionPrebuilder):

element_type = "Provided Operation"
def __init__(self, metamodel, spr_po):
self._spr_po = spr_po
c_c = one(spr_po).SPR_PEP[4503].C_P[4501].C_IR[4009].C_PO[4016].C_C[4010]()
ActionPrebuilder.__init__(self, metamodel, c_c)

@property
def label(self):
# interface = one(self._spr_po).SPR_PEP[4503].C_P[4501].C_IR[4009].C_I[4012]()
# port = one(self._spr_po).SPR_PEP[4503].C_P[4501].C_IR[4009].C_PO[4016]()
# return '%s::%s::%s' % (port.Name, interface.Name, self._spr_po.Name)
return ''

c_i = one(
self._spr_po).SPR_PEP[4503].C_P[4501].C_IR[4009].C_I[4012]()
c_po = one(
self._spr_po).SPR_PEP[4503].C_P[4501].C_IR[4009].C_PO[4016]()
return '%s::%s::%s::%s' % (self.c_c.Name, c_po.Name, c_i.Name, self._spr_po.Name)

def accept_BodyNode(self, node):
act_pob = self.new('ACT_POB')
relate(act_pob, self._spr_po, 687)
Expand All @@ -1803,16 +1844,20 @@ def accept_ParamAccessNode(self, node):


class ProvidedSignalPrebuilder(ActionPrebuilder):

element_type = "Provided Signal"
def __init__(self, metamodel, spr_ps):
self._spr_ps = spr_ps
c_c = one(spr_ps).SPR_PEP[4503].C_P[4501].C_IR[4009].C_PO[4016].C_C[4010]()
ActionPrebuilder.__init__(self, metamodel, c_c)

@property
def label(self):
return ''

c_i = one(
self._spr_ps).SPR_PEP[4503].C_P[4501].C_IR[4009].C_I[4012]()
c_po = one(
self._spr_ps).SPR_PEP[4503].C_P[4501].C_IR[4009].C_PO[4016]()
return '%s::%s::%s::%s' % (self.c_c.Name, c_po.Name, c_i.Name, self._spr_ps.Name)

def accept_BodyNode(self, node):
act_psb = self.new('ACT_PSB')
relate(act_psb, self._spr_ps, 686)
Expand Down Expand Up @@ -1863,8 +1908,10 @@ def prebuild_action(instance):
'SPR_PS': ProvidedSignalPrebuilder
}
metaclass = xtuml.get_metaclass(instance)
walker = walker_map[metaclass.kind](metaclass.metamodel, instance)
logger.info('processing action %s' % walker.label)
walker = walker_map[metaclass.kind](
metaclass.metamodel, instance)
logger.info('processing %s at %s' %
(walker.element_type, walker.label))
# walker.visitors.append(xtuml.tools.NodePrintVisitor())
root = oal.parse(instance.Action_Semantics_internal)
return walker.accept(root)
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def run(self):


setup(name='pyxtuml',
version='2.2.1', # ensure that this is the same as in xtuml.version
version='2.2.2', # ensure that this is the same as in xtuml.version
description='Library for parsing, manipulating, and generating BridgePoint xtUML models',
author=u'John Törnblom',
author_email='john.tornblom@gmail.com',
Expand Down
2 changes: 1 addition & 1 deletion xtuml/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@
name = 'pyxtuml'
date = '2020-03-12'
version = '2.2'
release = '2.2.1' # ensure that this is the same as in setup.py
release = '2.2.2' # ensure that this is the same as in setup.py

complete_string = '%s v%s (%s)' % (name, release, date)