def writeControllerConstructor(self, class_diagram, controller_sub_class, parameters=[]): self.writeConstructorSignature( "Controller", parameters + [ FormalParameter("keep_running", "", "true"), FormalParameter("finished_callback", "", None) ]) self.fOut.indent() self.fOut.write( controller_sub_class + ".call(this, new ObjectManager(this), keep_running, finished_callback);" ) for i in class_diagram.inports: self.fOut.write('this.addInputPort("' + i + '");') for i in class_diagram.outports: self.fOut.write('this.addOutputPort("' + i + '");') actual_parameters = [p.getIdent() for p in parameters] self.fOut.write('this.object_manager.createInstance("' + class_diagram.default_class.name + '", [' + ', '.join(actual_parameters) + ']);') self.fOut.dedent() self.fOut.write('};') self.fOut.write()
def writeTransitionsRecursively(self, current_node): self.writeMethodSignature(current_node.statechart.class_obj.name, "transition_" + current_node.full_name, [FormalParameter("event", "event")]) self.fOut.indent() valid_children = [] for child in current_node.children: if child.is_composite or child.is_basic: valid_children.append(child) self.fOut.write("var catched = false;") do_dedent = False if current_node.solves_conflict_outer: self.writeFromTransitions(current_node) if current_node.is_parallel_state or current_node.is_composite: self.fOut.write("if (!catched) {") self.fOut.indent() do_dedent = True if current_node.is_parallel_state: for child in valid_children: self.fOut.write("catched = this.transition_" + child.full_name + "(event) || catched") elif current_node.is_composite: for i, child in enumerate(valid_children): if i > 0: self.fOut.write("else ") else: self.fOut.write() self.fOut.extendWrite("if (this.current_state[this." + current_node.full_name + "][0] === this." + child.full_name + ") {") self.fOut.indent() self.fOut.write("catched = this.transition_" + child.full_name + "(event);") self.fOut.dedent() self.fOut.write("}") if current_node.solves_conflict_outer: if do_dedent: self.fOut.dedent() self.fOut.write("}") elif len(current_node.transitions) > 0: self.fOut.write("if (!catched) {") self.fOut.indent() self.writeFromTransitions(current_node) self.fOut.dedent() self.fOut.write("}") self.fOut.write("return catched;") self.fOut.dedent() self.fOut.write("};") self.fOut.write() for child in valid_children: self.writeTransitionsRecursively(child)
def writeControllerConstructor(self, class_diagram, parameters = []): self.writeMethodSignature('__init__', parameters + [FormalParameter("keep_running", "", "True")]) self.fOut.indent() self.fOut.write("super(Controller, self).__init__(ObjectManager(self), keep_running)") for i in class_diagram.inports: self.fOut.write('self.addInputPort("' + i + '")') for i in class_diagram.outports: self.fOut.write('self.addOutputPort("' + i + '")') actual_parameters = [p.getIdent() for p in parameters] self.fOut.write('self.object_manager.createInstance("'+ class_diagram.default_class.name +'", [' + ', '.join(actual_parameters)+ '])') self.fOut.write() self.fOut.dedent()
def visit_Constructor(self, constructor): self.fOut.write(constructor.access + " " + constructor.parent_class.name + "(") self.writeFormalParameters([FormalParameter("controller", "ControllerBase", None)] + constructor.getParams()) self.fOut.extendWrite(")") self.fOut.write("{") self.fOut.indent() self.fOut.write("this.commonConstructor(controller);") if constructor.body : self.fOut.write() self.fOut.write("//constructor body (user-defined)") self.writeCodeCorrectIndent(constructor.body) self.fOut.dedent() self.fOut.write("}") self.fOut.write()
def visit_Constructor(self, constructor): self.fOut.write("#The actual constructor") parameters = [FormalParameter("controller", "", None)] + constructor.getParams() self.writeMethodSignature("__init__", parameters) self.fOut.indent() if constructor.parent_class.statechart is not None : self.fOut.write("self.commonConstructor(controller)") else : self.fOut.write("self.commonConstructor()") if constructor.body : self.fOut.write() self.fOut.write("#constructor body (user-defined)") self.writeCodeCorrectIndent(constructor.body) self.fOut.dedent() self.fOut.write()
def writeControllerConstructor(self, class_diagram, parameters = []): self.fOut.write('public Controller(') self.writeFormalParameters(parameters + [FormalParameter("keep_running", "bool", "true")]) self.fOut.extendWrite(") : base(keep_running)") self.fOut.write('{') self.fOut.indent() for p in class_diagram.inports: self.fOut.write('this.addInputPort("' + p + '");') for p in class_diagram.outports: self.fOut.write('this.addOutputPort("' + p + '");') self.fOut.write('this.object_manager = new ObjectManager(this);') actual_parameters = [p.getIdent() for p in parameters] self.fOut.write('this.object_manager.createInstance("'+ class_diagram.default_class.name +'", new object[]{' + ', '.join(actual_parameters)+ '});') self.fOut.dedent() self.fOut.write('}')
def visit_StateChart(self, statechart): self.fOut.write("// Statechart enter/exit action method(s) :") self.fOut.write() #visit enter and exit action of children for i in statechart.composites + statechart.basics: if i is not statechart.root: i.enter_action.accept(self) i.exit_action.accept(self) # write out statecharts methods for enter/exit state if len(statechart.composites) > 1: self.fOut.write("// Statechart enter/exit default method(s) :") self.fOut.write() for i in statechart.composites: if i is not statechart.root: self.writeEnterDefault(i) # write out statecharts methods for enter/exit history if statechart.histories: self.fOut.write("// Statechart enter/exit history method(s) :") self.fOut.write() for i in statechart.shallow_history_parents: self.writeEnterHistory(i, False) for i in statechart.deep_history_parents: self.writeEnterHistory(i, True) self.fOut.write("// Statechart transitions :") self.fOut.write() self.writeTransitionsRecursively(statechart.root) # write out transition function self.fOut.write("// Execute transitions") self.writeMethodSignature( statechart.class_obj.name, "transition", [FormalParameter("event", "Event", "new Event()")]) self.fOut.indent() self.fOut.write("this.state_changed = this.transition_" + statechart.root.full_name + "(event);") self.fOut.dedent() self.fOut.write("};") self.fOut.write() # write out inState function self.fOut.write("// inState method for statechart") self.writeMethodSignature(statechart.class_obj.name, "inState", [FormalParameter("nodes", "Array")]) #self.fOut.write("def inState(self, nodes):") self.fOut.indent() self.fOut.write("for (var c in this.current_state) {") self.fOut.indent() self.fOut.write("if (!this.current_state.hasOwnProperty(c)) continue;") self.fOut.write("var new_nodes = new Array();") self.fOut.write("for (var n in nodes) {") self.fOut.indent() self.fOut.write("if (!nodes.hasOwnProperty(n)) continue;") self.fOut.write( "if (this.current_state[c].indexOf(nodes[n]) === -1) {") self.fOut.indent() self.fOut.write("new_nodes.push(nodes[n]);") self.fOut.dedent() self.fOut.write("}") self.fOut.dedent() self.fOut.write("}") self.fOut.write("nodes = new_nodes;") self.fOut.write("if (nodes.length === 0) {") self.fOut.indent() self.fOut.write("return true;") self.fOut.dedent() self.fOut.write("}") self.fOut.dedent() self.fOut.write("}") self.fOut.write("return false;") self.fOut.dedent() self.fOut.write("};") self.fOut.write()
def visit_Constructor(self, constructor): self.fOut.write("// Constructor") parameters = [FormalParameter("controller", "", None) ] + constructor.getParams() self.writeConstructorSignature(constructor.parent_class.name, parameters) self.fOut.indent() if constructor.parent_class.super_classes: self.fOut.write(constructor.parent_class.super_classes[0] + ".call(this);") else: self.fOut.write("RuntimeClassBase.call(this);") self.fOut.write() self.fOut.write("if (controller) {") self.fOut.indent() #visit input, output ports self.fOut.write("// User defined input ports") self.fOut.write("this.inports = new Object();") for p in constructor.parent_class.inports: self.fOut.write("this.inports[\"" + p + "\"] = controller.addInputPort(\"" + p + "\", this);") #for p in class_node.outports: # write attributes if constructor.parent_class.attributes: self.fOut.write() self.fOut.write("// User defined attributes") for attribute in constructor.parent_class.attributes: if attribute.init_value is None: self.fOut.write("this." + attribute.name + " = null;") else: self.fOut.write("this." + attribute.name + " = " + attribute.init_value + ";") self.fOut.write() # if there is a statechart if constructor.parent_class.statechart is not None: self.fOut.write("this.controller = controller;") self.fOut.write("this.object_manager = controller.object_manager;") self.fOut.write("this.current_state = new Object();") self.fOut.write("this.history_state = new Object();") if constructor.parent_class.statechart.nr_of_after_transitions: self.fOut.write("this.timers = new Object();") self.fOut.write() self.fOut.write("// Initialize statechart") if constructor.parent_class.statechart.histories: for node in constructor.parent_class.statechart.combined_history_parents: self.fOut.write("this.history_state[" + constructor.parent_class.name + "." + node.full_name + "] = new Array();") self.fOut.write() for c in constructor.parent_class.statechart.composites: self.fOut.write("this.current_state[this." + c.full_name + "] = new Array();") self.fOut.write() self.fOut.write("// Call user defined constructor") self.fOut.write(constructor.parent_class.name + ".prototype.user_defined_constructor.call(this") for p in constructor.getParams(): self.fOut.extendWrite(", ") p.accept(self) self.fOut.extendWrite(");") self.fOut.dedent() self.fOut.write("}") self.fOut.dedent() self.fOut.write("};") self.fOut.write()
def visit_Class(self, class_node): """ Generate code for Class construct """ self.fOut.write() # take care of inheritance if class_node.super_classes: class_node.super_classes.append("RuntimeClassBase") super_classes = [] for super_class in class_node.super_classes: super_classes.append(super_class) self.fOut.write("class " + class_node.name + "(" + ", ".join(super_classes) + "):") else: self.fOut.write("class " + class_node.name + "(RuntimeClassBase):") self.fOut.indent() self.fOut.write() if class_node.statechart is not None: # assign each node a unique ID self.fOut.write("# Unique IDs for all statechart nodes") for (i,node) in enumerate(class_node.statechart.composites + class_node.statechart.basics): self.fOut.write(node.full_name + " = " + str(i)) self.fOut.write() self.writeMethodSignature("commonConstructor", [FormalParameter("controller", "", "None")]) else : self.writeMethodSignature("commonConstructor") self.fOut.indent() self.fOut.write('"""Constructor part that is common for all constructors."""') self.fOut.write("RuntimeClassBase.__init__(self)") # write private input/output ports self.fOut.write() self.fOut.write("# User defined input ports") self.fOut.write("self.inports = {}") for p in class_node.inports: self.fOut.write("self.inports[\""+p+"\"] = controller.addInputPort(\""+p+"\", self)") # write attributes if class_node.attributes: self.fOut.write() self.fOut.write("# User defined attributes") for attribute in class_node.attributes: if attribute.init_value is None : self.fOut.write("self." + attribute.name + " = None") else : self.fOut.write("self." + attribute.name + " = " + attribute.init_value) self.fOut.write() # if there is a statechart if class_node.statechart is not None: self.fOut.write("self.controller = controller") self.fOut.write("self.object_manager = controller.getObjectManager()") self.fOut.write("self.current_state = {}") self.fOut.write("self.history_state = {}") if class_node.statechart.nr_of_after_transitions: self.fOut.write("self.timers = {}") self.fOut.write() self.fOut.write("#Initialize statechart :") self.fOut.write() if class_node.statechart.histories: for node in class_node.statechart.combined_history_parents: self.fOut.write("self.history_state[" + class_node.name + "." + node.full_name + "] = []") self.fOut.write() for c in class_node.statechart.composites : self.fOut.write("self.current_state[self." + c.full_name + "] = []") self.fOut.dedent() self.fOut.write() self.writeMethodSignature("start") self.fOut.indent() self.fOut.write("super(" + class_node.name + ", self).start()") if class_node.statechart: for default_node in class_node.statechart.root.defaults: if default_node.is_composite: self.fOut.write("self.enterDefault_" + default_node.full_name + "()") elif default_node.is_basic: self.fOut.write("self.enter_" + default_node.full_name + "()") self.fOut.dedent() self.fOut.write() #visit children for i in class_node.constructors : i.accept(self) for i in class_node.destructors : i.accept(self) for i in class_node.methods : i.accept(self) if class_node.statechart is not None: class_node.statechart.accept(self) # write out str method self.fOut.dedent()