{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "The module optimizer_server implements the connection to Optimizer server. \n", "\n", "\"\"\"\n", "\n", "import asyncio\n", "import nest_asyncio\n", "nest_asyncio.apply()\n", "\n", "class Optimizer():\n", " \"\"\"\n", " This class contains attributes and methods for connecting to a running Optimizer server, \n", " optimizing commands and queries, returning the result queries to be executed by Secondo.\n", " \n", " \"\"\"\n", " \n", " def __init__(self, server, port):\n", " \"\"\"\n", " The constructor of the calss Optimizer.\n", " \n", " :param server: The IP-address of Optimizer server.\n", " :param port: The port number of the socket.\n", " :return: None.\n", " \n", " \"\"\"\n", " \n", " self.server = server\n", " self.port = port\n", " self.initialized = False\n", " self.conn = None\n", " self.optreader = None\n", " self.optwriter = None\n", " loop = asyncio.get_event_loop()\n", " loop.run_until_complete(self.connect())\n", " \n", " \n", " async def connect(self):\n", " \"\"\"\n", " This method connects to Optimizer server using asyncio methods and sets the connection, \n", " stream- reader and writer attributes of the Optimizer class. \n", " \n", " \"\"\"\n", " \n", " if self.initialized == True:\n", " raise SecondoAPI_Error('Optimizer already initialised.')\n", " \n", " elif self.initialized == False:\n", " \n", " try:\n", " self.conn = asyncio.open_connection(self.server, int(self.port))\n", " except ConnectionRefusedError as e:\n", " raise SecondoAPI_Error(e.args[1] + ' - Connection to Optimizer server refused.')\n", " except OSError as e:\n", " raise SecondoAPI_Error(e.args[1] + ' - Connection to Optimizer couldnt be stablished.')\n", " \n", " \n", " try:\n", " self.optreader, self.optwriter = await asyncio.wait_for(self.conn, timeout = 10)\n", " except ConnectionRefusedError as e:\n", " raise SecondoAPI_Error(e.args[1] + ' - Connection to Optimizer server refused.')\n", " except OSError as e:\n", " raise SecondoAPI_Error(e.args[1] + ' - Connection to Optimizer couldnt be stablished.') \n", " \n", " \n", " message = \"\\n\"\n", " while True:\n", " self.optwriter.write(message.encode(\"utf-8\"))\n", " await self.optwriter.drain()\n", " \n", " \n", " line = await self.optreader.readline()\n", " \n", " line = line.decode(\"utf-8\")\n", " \n", " if not line:\n", " break\n", " \n", " if line != \"\\n\":\n", " break\n", " \n", " if line == \"\\n\":\n", " self.initialized = True\n", " print(\"Connection to Optimizer stablished...\")\n", " break\n", " \n", " \n", " def close(self):\n", " \"\"\"\n", " This method closes the connections to Optimizer server.\n", "\n", " \"\"\"\n", " if not self.initialized:\n", " raise SecondoAPI_Error('The connection to Optimizer has not been initialised.')\n", " self.initialized = False\n", " if self.optwriter is not None:\n", " self.optwriter.close()\n", " if self.conn is not None:\n", " self.conn.close()\n", " \n", " \n", " \n", " def get_opt_conn(self):\n", " \"\"\"\n", " This method returns the connection attribute of Optimizer object.\n", "\n", " :return: The connection attribute of Optimizer object.\n", " \"\"\"\n", " if self.conn is not None:\n", " return self.conn\n", " else:\n", " raise SecondoAPI_Error('The connection to Optimizer is reset.')\n", " \n", " \n", " def get_opt_initialized(self):\n", " if self.initialized:\n", " return True\n", " else:\n", " raise SecondoAPI_Error('Optimizer is already initialised.')\n", " \n", " \n", " def get_opt_streams(self):\n", " \"\"\"\n", " This method returns the stream reader/ writer attributes of Optimizer object.\n", " \n", " :return: The stream reader/ writer attributes of Optimizer object.\n", " \"\"\"\n", " if self.optreader is not None and self.optwriter is not None:\n", " return self.optreader, self.optwriter\n", " else:\n", " raise SecondoAPI_Error('Connection Error, Streams not connected.')\n", " #return None\n", " \n", " def get_server(self):\n", " \"\"\"\n", " This method returns the server attributes of Optimizer object.\n", " \n", " :return: The server attributes of Optimizer object, which consists of an IP-address eg. 127.0.0.0.\n", " \"\"\"\n", " return self.server\n", " \n", " \n", " def get_port(self):\n", " \n", " \"\"\"\n", " This method returns the port attributes of Optimizer object.\n", " :return: The port attributes of Optimizer object, which consists of an integer number as port eg. 5678.\n", " \"\"\"\n", " return self.port\n", " \n", " \n", " def set_opt_initialized(self, val):\n", " \"\"\"\n", " This method sets an attribute of Optimizer object that shows if the Optimizer is initialised and running.\n", " :param initialized: A boolean value, when True means the Optimizer is initialised and running.\n", " \"\"\"\n", " self.initialized = val\n", " \n", " " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }