class KleinBackendBuilder(visitor.BaseVisitor): def __init__(self): visitor.BaseVisitor.__init__(self) self._out = OutputPrinter() def _create_symbol_name(self, path): return path.replace("/", "_").replace("-", "_").replace(".", "_").replace('<', '').replace('>', '') def before(self): self._out.code([ '#', '# Generated by xwot compiler.', '#', '# Klein xwot application.', '#', '', 'import os', 'from yadp.device import Description', '', 'from xwot.util import local_ip', 'from xwot.util import create_description', 'from xwot.util import dir_path', 'from xwot.util import parent_dir_path', '', '# base config', 'ip = local_ip()', 'port = 5000', 'http_addr = "http://%s:%s/" % (ip, port)', 'module_dir_path = dir_path(__file__)', 'app_dir_path = parent_dir_path(__file__)', 'xwot_file = os.path.join(app_dir_path, "device.xwot")', '', 'jsonld_description_str = create_description(xwot_file=xwot_file, base=http_addr)', 'yadp_description = Description(content_type="application/ld+json", content=jsonld_description_str)', '', '', 'from klein import Klein', 'app = Klein()', ], ["xwot_app", "__init__"]) def after(self): self._out.code([ "import %s" % node.name() for node in self._nodes ], ["xwot_app", "__init__"]) self._out.code([ '#', '# Generated by xwot compiler.', '#', '# Klein xwot application.', '#', '', 'import xwot_app', 'from xwot_app import app', 'from xwot.util.klein import make_response', 'from xwot.util import deserialize', 'from xwot.util.klein import cors', 'from twisted.internet import task, reactor', '', 'import yadp', 'yadp.debug()', '', 'from yadp import service', 'from yadp.device import Device', '', "device = Device(urn='urn:xwot:Device', location=xwot_app.http_addr, descriptions=[xwot_app.yadp_description])", '', 'service = service()', 'service.register(device=device, passive=True)', '', "", "if __name__ == '__main__':", self._out.indent([ "app.run(host='0.0.0.0', port=xwot_app.port)" ]) ], ['runserver']) def before_resource(self, node): self._out.code([ '#', '# Generated by xwot compiler.', '#', '# Klein xwot application.', '#', "# Type: %s" % node.type(), "# Resource: %s" % node.name(), "# Path: %s" % node.fullpath(), '#', '', 'from xwot_app import app', 'from xwot_app import app', 'from xwot.util.klein import make_response', 'from xwot.util import deserialize', 'from xwot.util.klein import cors', 'from twisted.internet import task, reactor', '' ], ["xwot_app", node.name()]) def handle_entity(self, node): self._out.code([ '#', '# Generated by compiler compiler.', '#', '# Klein xwot application.', '#', "# Type: %s" % node.type(), "# Resource: %s" % node.name(), "# Path: %s" % node.fullpath(), '#', '', 'import xwot_app', 'from xwot_app import app', 'from twisted.web.static import File', '', '', "@app.route('/')", 'def home(request):', self._out.indent([ "request.setHeader('Content-Type', 'application/ld+json')", 'return xwot_app.jsonld_description_str' ]), '', '', "@app.route('/static/', branch=True)", "def static_files(request):", self._out.indent([ 'return File("./static")' ]), '', '', ], ["xwot_app", node.name()]) def handle_resource(self, node): for method in ['GET', 'PUT', 'OPTIONS']: self._out.code([ '#', "# %s '%s'" % (method.upper(), node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), method), "def handle%s_%s(request):" % (self._create_symbol_name(node.fullpath()), method), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", 'return "Name: %s , Hello at: %s"' % (node.name(), node.fullpath()) ]) ], ["xwot_app", node.name()]) def handle_device_resource(self, node): for method in ['GET', 'PUT', 'OPTIONS']: self._out.code([ '#', "# %s '%s'" % (method.upper(), node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), method), "def handle%s_%s(request):" % (self._create_symbol_name(node.fullpath()), method), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", 'return "Name: %s , Hello at: %s"' % (node.name(), node.fullpath()) ]) ], ["xwot_app", node.name()]) def handle_sensor_resource(self, node): for method in ['GET', 'OPTIONS']: self._out.code([ '#', "# %s '%s'" % (method.upper(), node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), method), "def handle%s_%s(request):" % (self._create_symbol_name(node.fullpath()), method), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", 'return "Name: %s , Hello at: %s"' % (node.name(), node.fullpath()) ]) ], ["xwot_app", node.name()]) def handle_tag_resource(self, node): for method in ['GET', 'OPTIONS']: self._out.code([ '#', "# %s '%s'" % (method.upper(), node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), method), "def handle%s_%s(request):" % (self._create_symbol_name(node.fullpath()), method), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", 'return "Name: %s , Hello at: %s"' % (node.name(), node.fullpath()) ]) ], ["xwot_app", node.name()]) def handle_context_resource(self, node): for method in ['GET', 'PUT', 'OPTIONS']: self._out.code([ '#', "# %s '%s'" % (method.upper(), node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), method), "def handle%s_%s(request):" % (self._create_symbol_name(node.fullpath()), method), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", 'return "Name: %s , Hello at: %s"' % (node.name(), node.fullpath()) ]) ], ["xwot_app", node.name()]) def handle_service_resource(self, node): for method in ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']: self._out.code([ '#', "# %s '%s'" % (method.upper(), node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), method), "def handle%s_%s(request):" % (self._create_symbol_name(node.fullpath()), method), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", 'return "Name: %s , Hello at: %s"' % (node.name(), node.fullpath()) ]) ], ["xwot_app", node.name()]) def handle_actuator_resource(self, node): for method in ['PUT', 'OPTIONS']: self._out.code([ '#', "# %s '%s'" % (method.upper(), node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), method), "def handle%s_%s(request):" % (self._create_symbol_name(node.fullpath()), method), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", 'return "Name: %s , Hello at: %s"' % (node.name(), node.fullpath()) ]) ], ["xwot_app", node.name()]) def handle_publisher_resource(self, node): self._out.code([ 'import json', 'import logging', 'from templates.tpl_client import ClientElement', 'from templates.tpl_clients import ClientsElement', 'from twisted.web.template import flattenString', 'from autobahn.twisted.resource import WebSocketResource, HTTPChannelHixie76Aware', 'from xwot.util.WebSocketSupport import xWoTStreamerProtocol', 'from xwot.util.WebSocketSupport import xWoTBroadcastFactory', 'from xwot.util.SubscriberDB import SubscriberDB', 'from xwot.util.SampleHardware import SampleHardware' ], ["xwot_app", node.name()]) self._out.code([ '#', "# %s '%s'" % ('GET', node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), 'GET'), "def handle%s_%s(request):" % (self._create_symbol_name(node.fullpath()), 'GET'), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", 'dbclient = SubscriberDB.getAllClients()', 'logging.debug(request.requestHeaders)', 'accept_type = request.requestHeaders.getRawHeaders("Accept")[0]', 'clients = ""', 'if not None:', ' if accept_type == "application/json":', ' request.setHeader("Content-Type", "application/json; charset=UTF-8")', ' request.setResponseCode(200)', ' for cl in dbclient:', ' clients += str(\'{"id":"%s", "uri":"%s", "method":"%s", "accept":"%s"}, \' % (cl[0], cl[1], cl[2], cl[3]))', " return str('{\"clients\": {\"client\":[%s]}}' % (clients[:-2]))", ' elif accept_type == "application/xml":', ' request.setHeader("Content-Type", "application/xml; charset=UTF-8")', ' request.setResponseCode(200)', ' for cl in dbclient:', " clients += str('<client><id>%s</id><uri>%s</uri><method>%s</method><accept>%s</accept></client> ' % (cl[0], cl[1], cl[2], cl[3]))", " return str('<clients>%s</clients>' % (clients))", ' else:', ' request.write("<!DOCTYPE html>\\n")', ' flattenString(request, ClientsElement(dbclient)).addCallback(request.write)', ' request.finish()' ]) ], ["xwot_app", node.name()]) self._out.code([ '#', "# %s '%s'" % ('POST', node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), 'POST'), "def handle%s_%s(request):" % (self._create_symbol_name(node.fullpath()), 'POST'), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", 'json_data = json.loads(request.content.getvalue())', 'logging.debug(json_data)', 'logging.debug(request.requestHeaders)', 'accept_type = request.requestHeaders.getRawHeaders("Accept")[0]', "lastrowid = SubscriberDB.insertClient(json_data['uri'], json_data['method'], json_data['accept'], '1')", 'if not None:', ' if accept_type == "application/json":', ' request.setHeader("Content-Type", "application/json; charset=UTF-8")', ' request.setResponseCode(200)', " return str('{\"id\":\"%s\", \"uri\":\"%s\", \"method\":\"%s\", \"accept\":\"%s\"}' % (lastrowid, json_data['uri'], json_data['method'], json_data['accept']))", ' elif accept_type == "application/xml":', ' request.setHeader("Content-Type", "application/xml; charset=UTF-8")', ' request.setResponseCode(200)', " return str('<client><id>%s</id><uri>%s</uri><method>%s</method><accept>%s</accept></client>' % (lastrowid, json_data['uri'], json_data['method'], json_data['accept']))", ' else:', ' request.write("<!DOCTYPE html>\\n")', " flattenString(request, ClientElement(lastrowid, json_data['uri'], json_data['method'], json_data['accept'], '')).addCallback(request.write)", ' request.finish()' ]) ], ["xwot_app", node.name()]) self._out.code([ '#', "# %s '%s'" % ('WS', node.fullpath()), '#', "@app.route('%s/', branch=True)" % (node.fullpath()), "def handle%s_ws(request):" % (self._create_symbol_name(node.fullpath())), self._out.indent([ 'ServerFactory = xWoTBroadcastFactory', "shutter = SampleHardware()", 'factory = ServerFactory("ws://*****:*****@app.route('%s', methods=['%s'])" % (node.fullpath(), 'OPTIONS'), "def handle%s_%s(request):" % (self._create_symbol_name(node.fullpath()), 'OPTIONS'), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", ]) ], ["xwot_app", node.name()]) def handle_publisher_client_resource(self, node): #nodename = 'ClientResource'.join(node._name.rsplit('Resource', 1)) self._out.code([ 'from twisted.web.server import NOT_DONE_YET', 'import logging', 'from templates.tpl_client import ClientElement', 'from twisted.web.template import Element, renderer, XMLFile, flattenString', 'from xwot.util.SubscriberDB import SubscriberDB', ], ["xwot_app", node.name()]) self._out.code([ '#' "# %s '%s'" % ('OPTIONS', node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), 'OPTIONS'), "def handle%s_%s(request, clientid):" % (self._create_symbol_name(node.fullpath()), 'OPTIONS'), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", ]) ], ["xwot_app", node.name()]) self._out.code([ '#' "# %s '%s'" % ('GET', node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), 'GET'), "def handle%s_%s(request, clientid):" % (self._create_symbol_name(node.fullpath()), 'GET'), self._out.indent([ "logging.debug(request.requestHeaders)", "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", "accept_type = request.requestHeaders.getRawHeaders('Accept')[0].split(',')[0]", "client = SubscriberDB.getClient(clientid)", "if not None:", " if 'application/json' in accept_type:", " request.setHeader('Content-Type', 'application/json; charset=UTF-8')", " request.setResponseCode(200)", " return str('{\"id\":\"%s\", \"uri\":\"%s\", \"method\":\"%s\", \"accept\":\"%s\"}' % (client[0], client[1], client[2], client[3]))", " elif accept_type == 'application/xml':", " request.setHeader('Content-Type', 'application/xml; charset=UTF-8')", " request.setResponseCode(200)", " return str('<client><id>%s</id><uri>%s</uri><method>%s</method><accept>%s</accept></client>' % (client[0], client[1], client[2], client[3]))", " else:", " request.write('<!DOCTYPE html>\\n')", " flattenString(request, ClientElement(client[0], client[1], client[2], client[3], '')).addCallback(request.write)", " request.finish()", ]) ], ["xwot_app", node.name()]) self._out.code([ '#' "# %s '%s'" % ('PUT', node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), 'PUT'), "def handle%s_%s(request, clientid):" % (self._create_symbol_name(node.fullpath()), 'PUT'), self._out.indent([ 'logging.debug(request.requestHeaders)', "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", 'accept_type = request.requestHeaders.getRawHeaders("Accept")[0].split(',')[0]', '#TODO Update the client in the databse', 'client = SubscriberDB.getClient(clientid)', 'if not None:', ' if "application/json" in accept_type:', ' request.setHeader("Content-Type", "application/json; charset=UTF-8")', ' request.setResponseCode(200)', ' return str(\'{"id":"%s", "uri":"%s", "method":"%s", "accept":"%s"}\' % (client[0], client[1], client[2], client[3]))', ' elif "application/xml" in accept_type:', ' request.setHeader("Content-Type", "application/xml; charset=UTF-8")', ' request.setResponseCode(200)', ' return str(\'<client><id>%s</id><uri>%s</uri><method>%s</method><accept>%s</accept></client>\' % (client[0], client[1], client[2], client[3]))', ' else:', ' request.write("<!DOCTYPE html>\\n")', ' flattenString(request, ClientElement(client[0], client[1], client[2], client[3], '')).addCallback(request.write)', ' request.finish()', ]) ], ["xwot_app", node.name()]) self._out.code([ '#' "# %s '%s'" % ('DELETE', node.fullpath()), '#', "@app.route('%s', methods=['%s'])" % (node.fullpath(), 'DELETE'), "def handle%s_%s(request, clientid):" % (self._create_symbol_name(node.fullpath()), 'DELETE'), self._out.indent([ "cors(request, methods=['GET', 'PUT', 'OPTIONS'])", 'logging.debug(request.requestHeaders)', 'accept_type = request.requestHeaders.getRawHeaders("Accept")[0].split(',')[0]', 'client = SubscriberDB.getClient(clientid)', 'SubscriberDB.deleteQuery(clientid)', 'if not None:', ' if "application/json" in accept_type:', ' request.setHeader("Content-Type", "application/json; charset=UTF-8")', ' request.setResponseCode(200)', ' return str(\'{"id":"%s", "uri":"%s", "method":"%s", "accept":"%s"}\' % (client[0], client[1], client[2], client[3]))', ' elif "application/xml" in accept_type:', ' request.setHeader("Content-Type", "application/xml; charset=UTF-8")', ' request.setResponseCode(200)', ' return str(\'<client><id>%s</id><uri>%s</uri><method>%s</method><accept>%s</accept></client>\' % (client[0], client[1], client[2], client[3]))', ' else:', ' request.write("<!DOCTYPE html>\\n")', ' flattenString(request, ClientElement(client[0], client[1], client[2], client[3], '')).addCallback(request.write)', ' request.finish()', ]) ], ["xwot_app", node.name()]) def _runserver_tac(self): return """# coding: utf-8 # # Generated by xwot compiler. # # Klein xwot application. # from twisted.internet import reactor from twisted.web.server import Site from twisted.application.service import Application import xwot_app from xwot_app import app import yadp from yadp import service from yadp.device import Device device = Device(urn='urn:xwot:Device', location=xwot_app.http_addr, descriptions=[xwot_app.yadp_description]) service = service() service.register(device=device, passive=True) application = Application('twisted-klein') reactor.listenTCP(xwot_app.port, Site(app.resource()), interface='0.0.0.0') """ def output(self): # get all created files files = self._out.flush() new_files_dic = {} for file_name, pycode in files.items(): # append to each file its correct file extension new_files_dic[file_name + ".py"] = pycode # create on the fly a requirements.txt file requirements = "\n".join(['klein']) new_files_dic['requirements.txt'] = requirements new_files_dic['runserver.tac'] = self._runserver_tac() return new_files_dic
def __init__(self): visitor.BaseVisitor.__init__(self) self._out = OutputPrinter()
class ExpressBackendBuilder(visitor.BaseVisitor): def __init__(self): visitor.BaseVisitor.__init__(self) self._out = OutputPrinter() def before(self): self._out.code([ '/*', ' * Generated by xwot compiler.', ' *', ' * Express.js xwot application.', ' */', '', 'module.exports = function() {', self._out.indent([ "var express = require('express');", 'var app = express();', ]) ], ["xwot", "app"]) def after(self): self._out.code([ self._out.indent( self._out.flatten([ [ "var %s = require('./%s.js');" % (node.name(), node.name()) for node in self._nodes ], [ "", "//register resources" ], [ "%s(app);" % node.name() for node in self._nodes ], [ '', 'return app;' ] ]) ), "};" ], ["xwot", "app"]) self._out.code([ '/*', ' * Generated by xwot compiler.', ' *', ' * Express.js xwot application.', ' */', '', "var xwot_app = require('./xwot/app.js')();", '', "var server = xwot_app.listen(3000, function() {", self._out.indent([ 'var host = server.address().address;', 'var port = server.address().port;', "console.log('Example app listening at http://%s:%s', host, port);" ]), '});' ], ["runserver"]) def before_resource(self, node): self._out.code([ '/*', ' * Generated by xwot compiler.', ' *', " * Type: %s" % node.type(), " * Resource: %s" % node.name(), " * Path: %s" % node.fullpath(), '*/', '', 'var setup = function(app) {', ], ["xwot", node.name()]) def after_resource(self, node): self._out.code([ '}', '', 'module.exports = setup;' ], ["xwot", node.name()]) def handle_entity(self, node): self.before_resource(node) self._out.code([ self._out.indent([ '/*', " * GET '/'", ' */', "app.get('/', function(req, res) { ", self._out.indent([ "res.send('Hello World at: %s');" % node.fullpath() ]), '});' ]), ], ["xwot", node.name()]) self.after_resource(node) def handle_resource(self, node): for method in ['get', 'put']: self._out.code([ self._out.indent([ '/*', " * %s '%s'" % (method.upper(), node.fullpath()), ' */', "app.%s('%s', function(req, res) { " % (method, node.fullpath()), self._out.indent([ 'res.end("Hello World at: %s");' % node.fullpath() ]), '});' ]), ], ["xwot", node.name()]) def handle_device_resource(self, node): for method in ['get', 'put']: self._out.code([ self._out.indent([ '/*', " * %s '%s'" % (method.upper(), node.fullpath()), ' */', "app.%s('%s', function(req, res) { " % (method, node.fullpath()), self._out.indent([ 'res.end("Hello World at: %s");' % node.fullpath() ]), '});' ]), ], ["xwot", node.name()]) def handle_sensor_resource(self, node): for method in ['get']: self._out.code([ self._out.indent([ '/*', " * %s '%s'" % (method.upper(), node.fullpath()), ' */', "app.%s('%s', function(req, res) { " % (method, node.fullpath()), self._out.indent([ 'res.end("Hello World at: %s");' % node.fullpath() ]), '});' ]), ], ["xwot", node.name()]) def handle_tag_resource(self, node): for method in ['get']: self._out.code([ self._out.indent([ '/*', " * %s '%s'" % (method.upper(), node.fullpath()), ' */', "app.%s('%s', function(req, res) { " % (method, node.fullpath()), self._out.indent([ 'res.end("Hello World at: %s");' % node.fullpath() ]), '});' ]), ], ["xwot", node.name()]) def handle_context_resource(self, node): for method in ['get', 'put']: self._out.code([ self._out.indent([ '/*', " * %s '%s'" % (method.upper(), node.fullpath()), ' */', "app.%s('%s', function(req, res) { " % (method, node.fullpath()), self._out.indent([ 'res.end("Hello World at: %s");' % node.fullpath() ]), '});' ]), ], ["xwot", node.name()]) def handle_service_resource(self, node): for method in ['get', 'post', 'put', 'delete']: self._out.code([ self._out.indent([ '/*', " * %s '%s'" % (method.upper(), node.fullpath()), ' */', "app.%s('%s', function(req, res) { " % (method, node.fullpath()), self._out.indent([ 'res.end("Hello World at: %s");' % node.fullpath() ]), '});' ]), ], ["xwot", node.name()]) def handle_actuator_resource(self, node): for method in ['put']: self._out.code([ self._out.indent([ '/*', " * %s '%s'" % (method.upper(), node.fullpath()), ' */', "app.%s('%s', function(req, res) { " % (method, node.fullpath()), self._out.indent([ 'res.end("Hello World at: %s");' % node.fullpath() ]), '});' ]), ], ["xwot", node.name()]) def handle_publisher_resource(self, node): for method in ['get', 'post']: self._out.code([ self._out.indent([ '/*', " * %s '%s'" % (method.upper(), node.fullpath()), ' */', "app.%s('%s', function(req, res) { " % (method, node.fullpath()), self._out.indent([ 'res.end("Hello World at: %s");' % node.fullpath() ]), '});' ]), ], ["xwot", node.name()]) def output(self): # get all created files files = self._out.flush() new_files_dic = {} for file_name, code in files.items(): # append to each file its correct file extension new_files_dic[file_name + ".js"] = code return new_files_dic